随着呆的模块,我们可以检查用的ressource名称和参数在视图中restrictedResource。
例如,在我看来,我有它,它工作得很好:
#{deadbolt.restrictedResource resourceKeys:['Domain'] , resourceParameters:['domainid':domain.id]}
<li><a href="@{Admin.showDomain(domain.id)}">${domain.title}</a></li>
#{/deadbolt.restrictedResource}
但在我的控制,我可以检查的ressource名字,但我没有找到一个方法来检查它在我RestrictedResourcesHandler通过与DOMAINID。
我要寻找一个解决方案,做这样的事情:
@RestrictedResource(name = {"Domain"}, params = {domainid})
public static void showDomain(String domainid)
{
}
提前致谢
它是不可能有一个注释动态信息,但可以使用PARAMS定义在请求的传入值的名称。 然而,因为它需要的地图信息没有传递到目前的处理程序。 虽然你可以在地图上从restrictedResource标签的参数传递,你不能从一个注释,以便空映射传递到处理程序做到这一点。
在这里你最好的办法是从请求对象拉一个众所周知的参数名称。 我需要有一个关于要做到这一点的最好办法重新思考而不破坏向后兼容性。
史蒂夫(呆的作者)
我已经找到了一种方式来解决问题,而不是最好的,我认为,但它是史蒂夫查洛纳的解决方案(呆的创建者),和它的作品。
例如,如果你的控制器的方法参数被命名为“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;
}
}
然后,只需要您的foreach 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()
}
}
文章来源: Deadbolt - Play Framework - How to check a @RestrictedResource with parameters in a controller?