首先,我仍然是scala的新手,所以这个问题看起来很基本,或者我的方法可能不对,但我无法弄清楚如何做到这一点:
我已将 Oauth2 身份验证集成到我的项目中,现在我正在尝试自动化登录,因此不是在每个函数中写入:
Action.async { implicit request =>
authorize(new OauthDataHandler()) { authInfo =>
代码,我想使用我的自定义Action并执行:
def index = OAuth2Action { implicit request =>
Future(Ok("Welcome"))
}
和
object OAuth2Action extends OAuth2Provider{
def apply(f: Request[AnyContent] => Future[Result]): Action[AnyContent] = {
Action.async { implicit request =>
authorize(new OauthDataHandler()) { authInfo =>
f(request)
}
}
}
}
但是,这里是我在场景中缺少scala语法的地方,我想在authInfo
函数中保留我的index
对象的引用(因为我需要一些用户信息)那里)。有没有办法做到这一点?
提前谢谢
编辑:基于@johanandren回答的解决方案,我意识到我无法通过Actions发送此数据,因此我使用了ActionBuilder进行身份验证:
case class AuthenticatedRequest[A](user: User, request: Request[A]) extends WrappedRequest(request)
object Authenticated extends ActionBuilder[AuthenticatedRequest] with OAuth2Provider {
def invokeBlock[A](request: Request[A], block: AuthenticatedRequest[A] => Future[Result]) = {
authenticate(block)(request)
}
def authenticate[A]( block: AuthenticatedRequest[A] => Future[Result])(implicit request: Request[A]) = {
authorize(new OauthDataHandler()) { authInfo =>
block(AuthenticatedRequest(authInfo.user, request))
}
}
}
答案 0 :(得分:1)
在播放文档中查看带有动作构建器的动作合成,完全符合您的要求:
https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition