1

認可されたリンクを含む scala テンプレートでメニューを作成すると、次のようになります。

<ul>
    <li><a href="@routes.Application.index()">Home</a></li>
    @subjectNotPresent() {
        <li><a href="@routes.Application.login()">Login</a></li>
    }
    @@restrict(handler, List(as("foo"))) {
        <li><a href="@routes.Application.foo()">foo</a></li>
    }
    @subjectPresent() {
        <li><a href="@routes.Application.logout()">Logout</a></li>
    }    
</ul>

Application.foo へのリンクには、ロール foo を配置する必要があります。@@restrict(handler, List(as("foo")))ただし、このステートメントをより動的なステートメントに変更したいと思います。ユーザーにロール foo があるかどうかを尋ねるのではなく、ユーザーが application.foo にもアクセスできるかどうかを尋ねたいと思います。

これにより、メニューの複雑さが軽減されます。重要な利点は、scala テンプレートではなく、コントローラーでのみ制限を変更する必要があることです。

これは可能ですか?

4

1 に答える 1

0

必要なことを正確に行う動的タグを使用できます。これを示す例がhttp://deadbolt-2-scala.herokuapp.com/#template-dynamicにあります。ここでそれを肉付けするために、

@dynamic(handler, "foo") {
  This content may be visible, depending on your luck
}

foo は、制限するリソースの名前です。DeadboltHandler では、動的コントロールを定義する DynamicResourceHandler を返す必要があります。

class MyDeadboltHandler(dynamicResourceHandler: Option[DynamicResourceHandler] = None) extends DeadboltHandler {

    override def getDynamicResourceHandler[A](request: Request[A]): Option[DynamicResourceHandler] = {
        if (dynamicResourceHandler.isDefined) dynamicResourceHandler
        else Some(new MyDynamicResourceHandler())
    }
}

DynamicResourceHandler はいくつかの方法で実装できますが、通常はファサードがうまく機能します。例を単純にするために、この場合は値をハードコーディングします。

class MyDynamicResourceHandler extends DynamicResourceHandler
{
    def isAllowed[A](name: String, meta: String, handler: DeadboltHandler, request: Request[A]) = {
        MyDynamicResourceHandler.handlers(name).isAllowed(name,
                                                          meta,
                                                          handler,
                                                          request)
    }

    def checkPermission[A](permissionValue: String, deadboltHandler: DeadboltHandler, request: Request[A]) = {
        // todo implement this when demonstrating permissions
        false
    }
}

object MyDynamicResourceHandler {
    val handlers: Map[String, DynamicResourceHandler] = Map(
        "foo" -> new DynamicResourceHandler() {
           def isAllowed[A](name: String, meta: String, deadboltHandler: DeadboltHandler, request: Request[A]) =
         // do something here to determine if the subject has access

           def checkPermission[A](permissionValue: String, deadboltHandler: DeadboltHandler, request: Request[A]) = false
     }
   )
}
于 2013-05-20T06:39:41.050 に答える