1

まず第一に、私は Play Framework の初心者なので、これは非常に基本的なことかもしれませんが、明確にするのに十分なドキュメントが見つかりませんでした。

現在、Oauth2 を使用してユーザーを識別および承認するプロジェクトがあります。これは ActionBuilder で行われており、うまく機能しています。

私が今欲しいのは追加の「レイヤー」です。これは、承認後に、ユーザーに十分な権限があるかどうかを確認することを意味します(権限テーブルはDBに保存されます)。

私はアクション合成について読んだことがありますが、私は ActionBuilder を使用しているので、それらでそれを行うことができるはずだと思います。composeAction 関数をてきましたが、これを実装する方法がよくわかりません。

私のコードは、現在次のようになっています。

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

  def authenticate[A](block: AuthenticatedRequest[A] => Future[Result])(implicit request: Request[A]) = {
    authorize(new OauthDataHandler()) { authInfo =>
      block(AuthenticatedRequest(authInfo.user, request))
    }
  }

  object Authenticated extends api.mvc.ActionBuilder[AuthenticatedRequest]  {

    def invokeBlock[A](request: Request[A], block: AuthenticatedRequest[A] => Future[Result]) = {
      authenticate(block)(request)
    }
  }
}

そして、今の私の試みはこれです:

case class PermissionAuthenticatedRequest[A](user: User, zone: String, request: Request[A]) extends WrappedRequest(request)

  object PermissionAuthenticated extends api.mvc.ActionBuilder[PermissionAuthenticatedRequest] {
    def invokeBlock[A](request: Request[A], block: PermissionAuthenticatedRequest[A] => Future[Result]) = {

      checkPermissions(???/*user*/, ???/*zone*/,block)(request)
    }

    def checkPermissions[A](user: User, permission: String, block: PermissionAuthenticatedRequest[A] => Future[Result])(implicit request: Request[A]) = {
        if(user._id == 1) //silly check
          block(PermissionAuthenticatedRequest(user, permission, request)) 
        else 
          Future.successful(Forbidden)
    }
  }

しかし、ユーザー (他の AuthenticatedAction から) または権限 (リクエストから) を取得する方法はまだわかりません。

前もって感謝します。

4

1 に答える 1