2013-05-13 71 views
1

在與他們一些授權鏈接Scala的模板製作菜單看起來就像這樣:呆2斯卡拉問,如果用戶訪問路徑

<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")))更改爲更加動態的聲明。我想詢問用戶是否有權訪問application.foo而不是詢問用戶是否具有角色foo。

這使得菜單更加複雜。一個重要的好處是限制只需要在控制器中進行修改,而不是scala模板。

這可能嗎?

回答

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