使用Deadbolt的模块,我们可以在视图中使用资源名称和参数来检查restrictedResource。
例如,在我看来,我有它,并且它工作得很好:
#{deadbolt.restrictedResource resourceKeys:['Domain'] , resourceParameters:['domainid':domain.id]}
<li><a href="@{Admin.showDomain(domain.id)}">${domain.title}</a></li>
#{/deadbolt.restrictedResource}但是在我的控制器中,我只能检查资源名称,但是我找不到在我的RestrictedResourcesHandler中检查它的方法,通过传递域名it。
我正在寻找一个解决方案来做这样的事情:
@RestrictedResource(name = {"Domain"}, params = {domainid})
public static void showDomain(String domainid)
{
}提前感谢
发布于 2012-07-25 15:55:46
不可能在注释中包含动态信息,但是可以使用params来定义请求中传入的值的名称。但是,此信息目前不会传递给处理程序,因为它需要一个映射。虽然可以从restrictedResource标记传入参数映射,但不能通过注释完成此操作,因此会将一个空映射传递给处理程序。
这里最好的方法是从请求对象中提取一个众所周知的参数名。我需要重新思考如何在不破坏向后兼容性的前提下做到这一点。
Steve (Deadbolt的作者)
发布于 2012-08-17 20:38:49
我已经找到了一种解决问题的方法,虽然不是我认为最好的,但它是Steve Chaloner的解决方案(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方法中访问您的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()
}
}https://stackoverflow.com/questions/11628802
复制相似问题