2016-06-17 10 views
0

セキュリティのためのカスタマイズアクションを作成しようとしています。私はアプリケーションでセキュリティを処理し、カスタムアクションを作成しようとして、Scala Oauth を使用して、カスタムアクションにScala Oauthセキュリティをラップしています。 Play Frameworkドキュメンテーションによると、私は2つの方法でラップされたリクエストオブジェクトを使用していますが、残念ながら、カスタムのリクエストハンドラをカスタムアクションハンドラで取得していません。Play Framework 2.3.x:Play FrameworkでScala Oauthを使用してリクエストオブジェクトをラップする

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")) 
} 

答えて

0

があります。私はAuthRequestの代わりにをinvokeBlockメソッドで使用しています。修正のために以下のコードを見つけてください。

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) 
} 
関連する問題