【问题标题】:Play Framework 2.3.x: Wrap Request object using Scala Oauth in Play FrameworkPlay Framework 2.3.x:在 Play Framework 中使用 Scala Oauth 包装 Request 对象
【发布时间】:2016-06-17 18:06:35
【问题描述】:

我正在尝试为安全创建自定义操作。我正在使用Scala Oauth 用于处理我的应用程序中的安全性并尝试创建自定义操作并将Scala Oauth 安全性包装在我的自定义操作中。根据 Play Framework Documentation,我使用两种方法来包装请求对象,但不幸的是,我没有在自定义操作处理程序中获取自定义请求对象。以下是方法:

case class AuthRequest[A](user: User, request: Request[A]) extends WrappedRequest[A](request)

第一道

case class CustomSecurityAction[A](action: Action[A]) extends Action[A] with OAuth2Provider{

 def apply(request: Request[A]): Future[Result] = {
  implicit val executionContext: ExecutionContext = play.api.libs.concurrent.Execution.defaultContext

  request.headers.get("Host").map { host =>
   authorize(new SecurityDataHandler(host)) { authInfo =>
    action(AuthRequest(authInfo.user, request))
   }(request, executionContext)
  } getOrElse {
   Future.successful(Unauthorized("401 No user\n"))
  }}

  lazy val parser = action.parser
}

object SecurityAction extends ActionBuilder[Request] with OAuth2Provider {
 def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
  block(request)
 }
 override def composeAction[A](action: Action[A]) = new CustomSecurityAction(action)
}

第二种方式

object SecurityAction extends ActionBuilder[Request] with OAuth2Provider {

 def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
  implicit val executionContext: ExecutionContext = play.api.libs.concurrent.Execution.defaultContext

  request.headers.get("Host").map { host =>
   authorize(new SecurityDataHandler(host)) { authInfo =>
     block(AuthRequest(authInfo.user, request))
   }(request, executionContext)
  } getOrElse {
    Future.successful(Unauthorized("401 No user\n"))
  }
}

根据这两种方式,当我尝试在我的自定义处理程序中使用 user 对象时,我收到以下编译时错误:

value user is not a member of play.api.mvc.Request[play.api.mvc.AnyContent]
 val user = request.user

以下是我的处理程序代码:

def testCustomAction = SecurityAction { request =>
 val user = request.user
 Future.successful(Ok("Apna To Chal Gya"))
} 

【问题讨论】:

    标签: scala security oauth playframework-2.3


    【解决方案1】:

    上面的代码有一个简单的问题。我在invokeBlock 方法中使用play.api.mvc.Request 而不是AuthRequest。请找到下面的代码进行更正。

    object SecurityAction extends ActionBuilder[AuthRequest] {
    
      override def invokeBlock[A](request: Request[A], block: (AuthRequest[A]) => Future[Result]) = {
    
        request match {
         case re: AuthRequest[A] => block(re)
         case _ => Future.successful(Results.Unauthorized("401 No user\n"))
        }
      }
      override def composeAction[A](action: Action[A]) = CustomSecurityAction(action)
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多