我正在尝试将Deadbolt2集成到我的play Framework2.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。我正在跟踪螺栓实例,这对我有很大帮助,但我不知道如何将隐式请求传递到实际操作中。
我的模板开头如下:
@(loginForm: Form[LoginForm])(implicit flash: Flash)直接使用Action,而不使用deadbolt.SubjectNotPresent(),效果很好。
发布于 2016-02-29 07:06:37
一个持续不断的问题是“我如何在授权的行动中得到主体?”从DeadBolt2.5开始,传递到操作中的请求已被替换为包含AuthenticatedRequest的Option[Subject]。由于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")
}
}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))
}
}变成了
def login = deadbolt.SubjectNotPresent()() { authRequest =>
Future {
Ok(login(loginForm))
}
}https://stackoverflow.com/questions/35636980
复制相似问题