deadbolt2和隐式请求

时间:2016-02-25 19:52:23

标签: scala playframework deadbolt-2

我试图将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)

直接使用Actiondeadbolt.SubjectNotPresent()效果不错。

1 个答案:

答案 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))
  }
}