deadbolt2 和隐式请求
deadbolt2 and implicit request
我正在尝试将 Deadbolt2 集成到我的游戏框架 2.4 应用程序中。
我的控制器中有以下代码
import be.objectify.deadbolt.scala.{ActionBuilders, AuthenticatedRequest, DeadboltActions}
import be.objectify.deadbolt.scala.cache.HandlerCache
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{AnyContent, _}
import modules.user.security.{Authenticator, HandlerKeys, MyDeadboltHandler}
class Login @Inject() (deadbolt: DeadboltActions, handlers: HandlerCache, actionBuilder: ActionBuilders) extends Controller {
//...
def login = deadbolt.SubjectNotPresent() {
Action { implicit request =>
Ok(login(loginForm))
}
}
}
我收到错误 missing parameter type
。我正在关注 deadbolt examples,这对我有很大帮助,但我不知道如何将隐式请求转化为行动。
我的模板是这样开始的:
@(loginForm: Form[LoginForm])(implicit flash: Flash)
不使用 deadbolt.SubjectNotPresent()
直接使用 Action
效果很好。
一个不断出现的问题是 "how do I get the subject in an authorized action?"。从 Deadbolt 2.5 开始,传递给动作的请求已被替换为包含 Option[Subject]
的 AuthenticatedRequest
。由于 2.4 的用户也需要此功能,因此它已作为重大更改包含在 2.4.4 中。
以下示例以SubjectPresent
为例,但相同的更改适用于所有授权约束。
使用动作生成器时,代替
def index = actionBuilder.SubjectPresentAction().defaultHandler() { implicit request
Ok(accessOk())
}
我们现在有
def index = actionBuilder.SubjectPresentAction().defaultHandler() { authRequest =>
Future {
Ok(accessOk())
}
}
使用动作组合时,代替
def index = deadbolt.SubjectPresent() { implicit request
Action {
Ok(accessOk())
}
}
我们现在有
def someFunctionA = deadbolt.SubjectPresent()() { authRequest =>
Future {
Ok("Content accessible")
}
}
DeadboltHandler
特征的 getSubject()
函数现在采用 AuthenticatedRequest
而不是 Request
。
override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] =
request.subject match {
case Some(user) => Future {request.subject}
case None => // get from database, identity platform, cache, whatever
}
这对您的应用意味着
def login = deadbolt.SubjectNotPresent() {
Action { implicit request =>
Ok(login(loginForm))
}
}
变成
def login = deadbolt.SubjectNotPresent()() { authRequest =>
Future {
Ok(login(loginForm))
}
}
我正在尝试将 Deadbolt2 集成到我的游戏框架 2.4 应用程序中。
我的控制器中有以下代码
import be.objectify.deadbolt.scala.{ActionBuilders, AuthenticatedRequest, DeadboltActions}
import be.objectify.deadbolt.scala.cache.HandlerCache
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{AnyContent, _}
import modules.user.security.{Authenticator, HandlerKeys, MyDeadboltHandler}
class Login @Inject() (deadbolt: DeadboltActions, handlers: HandlerCache, actionBuilder: ActionBuilders) extends Controller {
//...
def login = deadbolt.SubjectNotPresent() {
Action { implicit request =>
Ok(login(loginForm))
}
}
}
我收到错误 missing parameter type
。我正在关注 deadbolt examples,这对我有很大帮助,但我不知道如何将隐式请求转化为行动。
我的模板是这样开始的:
@(loginForm: Form[LoginForm])(implicit flash: Flash)
不使用 deadbolt.SubjectNotPresent()
直接使用 Action
效果很好。
一个不断出现的问题是 "how do I get the subject in an authorized action?"。从 Deadbolt 2.5 开始,传递给动作的请求已被替换为包含 Option[Subject]
的 AuthenticatedRequest
。由于 2.4 的用户也需要此功能,因此它已作为重大更改包含在 2.4.4 中。
以下示例以SubjectPresent
为例,但相同的更改适用于所有授权约束。
使用动作生成器时,代替
def index = actionBuilder.SubjectPresentAction().defaultHandler() { implicit request
Ok(accessOk())
}
我们现在有
def index = actionBuilder.SubjectPresentAction().defaultHandler() { authRequest =>
Future {
Ok(accessOk())
}
}
使用动作组合时,代替
def index = deadbolt.SubjectPresent() { implicit request
Action {
Ok(accessOk())
}
}
我们现在有
def someFunctionA = deadbolt.SubjectPresent()() { authRequest =>
Future {
Ok("Content accessible")
}
}
DeadboltHandler
特征的 getSubject()
函数现在采用 AuthenticatedRequest
而不是 Request
。
override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] =
request.subject match {
case Some(user) => Future {request.subject}
case None => // get from database, identity platform, cache, whatever
}
这对您的应用意味着
def login = deadbolt.SubjectNotPresent() {
Action { implicit request =>
Ok(login(loginForm))
}
}
变成
def login = deadbolt.SubjectNotPresent()() { authRequest =>
Future {
Ok(login(loginForm))
}
}