【问题标题】:Deadbolt 2 in Scala ask if user has access to routeScala 中的 Deadbolt 2 询问用户是否有权访问路由
【发布时间】:2013-05-07 12:27:33
【问题描述】:

在 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"))) 更改为更动态的声明。我想询问用户是否也可以访问 application.foo 而不是询问用户是否具有角色 foo。

这使得菜单不那么复杂。一个重要的好处是只需要在控制器中修改限制,而不是 scala 模板。

这可能吗?

【问题讨论】:

    标签: scala playframework-2.0 playframework-2.1 deadbolt


    【解决方案1】:

    您可以使用动态标签,这正是您所需要的。你可以在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
         }
       )
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多