まず第一に、私は 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 から) または権限 (リクエストから) を取得する方法はまだわかりません。
前もって感謝します。