【问题标题】:Deadbolt - Play Framework - How to check a @RestrictedResource with parameters in a controller?Deadbolt - Play Framework - 如何使用控制器中的参数检查 @RestrictedResource?
【发布时间】:2012-07-24 10:22:14
【问题描述】:

使用 Deadbolt 的模块,我们可以在视图中使用资源名称和参数检查受限制的资源。

例如在我看来,我有它,而且效果很好:

#{deadbolt.restrictedResource resourceKeys:['Domain'] , resourceParameters:['domainid':domain.id]}
   <li><a href="@{Admin.showDomain(domain.id)}">${domain.title}</a></li>
#{/deadbolt.restrictedResource}

但在我的控制器中,我只能检查资源名称,但我找不到在传递域 ID 的 RestrictedResourcesHandler 中检查它的方法。

我正在寻找一个解决方案来做这样的事情:

@RestrictedResource(name = {"Domain"}, params = {domainid})
public static void showDomain(String domainid)
{
}

提前致谢

【问题讨论】:

    标签: java playframework authorization acl deadbolt


    【解决方案1】:

    注解中不可能有动态信息,但您可以使用参数来定义请求中传入值的名称。但是,此信息目前没有传递到处理程序,因为它需要一个地图。虽然您可以从restrictedResource 标记传入参数映射,但不能通过注释执行此操作,因此会将空映射传递给处理程序。

    您最好的方法是从请求对象中提取一个众所周知的参数名称。我需要重新考虑在不破坏向后兼容性的情况下执行此操作的最佳方法。

    史蒂夫(Deadbolt 的作者)

    【讨论】:

      【解决方案2】:

      我找到了解决问题的方法,不是我认为的最好的方法,但它是 Steve Chaloner 的解决方案(Deadbolt 的创造者),并且有效。

      例如,如果您的 Controller 的方法参数名为“id”,并且您想在 checkAccess 方法中检查此 id:

      // Controller's method : 
      @RestrictedResource(name = {"Domain"})
      public static void showDomain(String id){} 
      

      只需检查您的 checkAccess 方法开头的 Map "resourceParameters" 是否为空,并使用请求对象获取参数:

      public AccessResult checkAccess(List<String> resourceNames,
                                      Map<String, String> resourceParameters)
      {    
          Map<String, String> hashm = new HashMap<String,String>();
      
          if(resourceParameters != null && !resourceParameters.isEmpty()){
              hashm = resourceParameters;
          }else if(Http.Request.current().routeArgs!= null && !Http.Request.current().routeArgs.isEmpty()){
              hashm = Http.Request.current().routeArgs;
          }
      }
      

      然后只需要在你的 checkAccess 方法中 foreach 你的 hashmap 来获取你的 Controller 的方法参数并根据需要检查 Access。

      for (Map.Entry<String,String> mp : hashm.entrySet())
      {
          // Get the id argument
          if(mp.getKey().equals("id"))
          {
              // Do something with the value..
              mp.getValue()
          }        
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-10
        • 2016-01-01
        • 1970-01-01
        相关资源
        最近更新 更多