2017-01-26 8 views
0

私はScala PlayアプリケーションでDeadboltをテストしています。私は、ユーザーがprojectIdは、このユーザーに属している場合、プロジェクトを取得することを許可することにしたい、この場合、パラメータに基づくDeadbolt承認

def getProject(projectId: Int) = actionBuilder.RestrictAction("user").defaultHandler() { 
    authRequest => 
    //retrieves project 
} 

:私のコントローラメソッドは次のようになり。他のより複雑なケースでは、クエリ文字列および/または投稿本文の両方から複数のパラメータが含まれます。

ここからわかるように、ここでのアプローチは、パラメータをDynamicResourceHandlerに渡してから、それぞれのケースごとに個別にアクセス権を処理することです。これは実現可能ですが、私はDeadboltからのサポートがこのユースケースのためにもう少し期待されていました。受け取ったパラメータに基づいてリクエストを承認する最善の方法は何ですか?

答えて

1

Deadboltは、開発者を特定のスタイルに強制しないようにかなりニュートラルなままですが、この場合はmeta引数を使用して情報を制約に渡すことができます。定義は

object DynamicAction { 

    def apply(name: String, meta: Option[Any] = None): DynamicAction.DynamicActionBuilder = DynamicActionBuilder(name, meta) 

    case class DynamicActionBuilder(name: String, meta: Option[Any] = None) extends DeadboltActionBuilder { 

     override def apply[A](bodyParser: BodyParser[A])(block: AuthenticatedRequest[A] => Future[Result])(implicit handler: DeadboltHandler) : Action[A] = 
     deadboltActions.Dynamic(name, meta, handler)(bodyParser)(block) 
    } 
    } 

ので、あなたのコントローラ機能は、この

def getProject(projectId: Int) = actionBuilder.DynamicAction(name = "checkProject", meta = Some(projectId)).defaultHandler() { 
    authRequest => 
    //retrieves project 
} 

ようになります。これは、(私はその名前を嫌いに来て、私はいくつかの将来のバージョンでそれを変更することがあります)DynamicResourceHandlerを取得しますですこの機能

def isAllowed[A](name: String, 
        meta: Option[Any] = None, 
        deadboltHandler: DeadboltHandler, 
        request: AuthenticatedRequest[A]): Future[Boolean] 

の実装を呼び出すあなたはmeta値のためasInstanceOfを使用する必要があります。

より複雑な要件の場合は、データを組み立てたもの(ケースクラスまたはマップなど)をmeta引数として渡すことができます。

+0

答えをありがとう。それは私がそれをやろうと思っていたようなものでした。私はコントローラの代わりにルートにデッドボルトを使用する方法についても読んでいましたが、そこではパラメータ値に正しくアクセスすることは難しいでしょうか? – nmat

+0

実際、ルートでは、メタをハードコードすることしかできません。また、URLを独自に解析して値を取得することもできますが、すでにかなり重くなっています。 –

関連する問題