自动化用户登录并在Play Framework中保留用户信息的好方法

时间:2015-02-12 10:23:55

标签: scala playframework-2.0 implicit

首先,我仍然是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))
    }
  }
}

1 个答案:

答案 0 :(得分:1)

在播放文档中查看带有动作构建器的动作合成,完全符合您的要求:

https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition