我试图将Deadbolt2集成到我的播放框架2.4应用程序中。
A在我的控制器中有以下代码
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)
直接使用Action
而deadbolt.SubjectNotPresent()
效果不错。
答案 0 :(得分:2)
一个持续存在的问题是"如何通过授权行动获得主题?"。从Deadbolt 2.5开始,传递给操作的请求已替换为包含AuthenticatedRequest
的{{1}}。由于2.4的用户也想要这个功能,因此它已作为一个重大变化包含在2.4.4中。
以下示例使用Option[Subject]
作为示例,但同样的更改适用于所有授权约束。
使用动作构建器时,代替
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")
}
}
特征的getSubject()
功能现在需要DeadboltHandler
而不是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))
}
}