3

使用 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)
{
}

提前致谢

4

2 回答 2

4

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

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

史蒂夫(Deadbolt 的作者)

于 2012-07-25T07:55:45.667 回答
1

我找到了解决问题的方法,不是我认为的最好的方法,但它是 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()
    }        
}
于 2012-08-17T12:38:48.563 回答