有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java死锁播放框架如何使用控制器中的参数检查@RestrictedResource?

使用Deadbolt的模块,我们可以在视图中使用ressource名称和参数检查restrictedResource

例如,在我看来,我拥有它,而且它运行良好:

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

但是在我的控制器中,我只能检查ressource名称,但是我没有找到在我的RestrictedResourceHandler中检查它的方法来传递domainid

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

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

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    我已经找到了一种解决问题的方法,不是我认为最好的,但它是史蒂夫·查洛纳的解决方案(Deadbolt的创造者),而且有效

    例如,如果控制器的方法参数名为“id”,并且您希望在checkAccess方法中检查此id:

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

    只需在checkAccess方法的开头检查映射“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,以获取控制器的方法参数,并根据需要检查访问

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

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

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

    史蒂夫(死锁的作者)