我在我的控制器上使用Deadbolt 2中的动态权限来检查用户是否有权访问资源。这个资源有一个ID,在我的控制器中,我有一个方法getById(String id)
。看起来像这样:
@Dynamic("checkAccess")
public CompletionStage<Result> getById(String id) {
//Go get my item from DB
}
在我在Deadbolt中的自定义资源处理程序中,我想使用在调用时传递给方法的id String(例如,检查当前用户是否拥有ID指定的此特定项目的所有权) )。
ID至少存在于两个位置:我的URL,作为路由参数,以及调用方法时的参数。如何在动态权限控制器中访问此ID:
HANDLERS.put("checkAccess", Optional.of(new AbstractDynamicResourceHandler() {
public CompletionStage<Boolean> isAllowed(final String name, final Optional<String> meta,
final DeadboltHandler deadboltHandler, final Http.Context context) {
Logger.debug("*** Custom permission test");
//HERE - Do something with the ID
return CompletableFuture.completedFuture(Boolean.FALSE);
}
}));
我发现了一些关于这个问题的问题here,但它非常hacky,而且是在6年前,我有点希望能有更清洁的方法来做到这一点。
答案 0 :(得分:0)
如果使用自己的DynamicResourceHandler,则应该在某个地方实现DynamicResourceHandler
接口。在那里,您将需要实现isAllowed()
函数(用于@Dynamic
注释)。其参数之一是Http.context ctx
,您可以使用ctx.request()
从中获取路由参数,以进行权限检查。
import be.objectify.deadbolt.java.*;
import play.mvc.Http;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
public class YourOwnDynamicResourceHandler implements DynamicResourceHandler {
@Override
public CompletionStage<Boolean> isAllowed(String name, Optional<String> meta, DeadboltHandler deadboltHandler, Http.Context ctx) {
System.out.println(ctx.request().toString()); // <- route parameters
// Your check goes here
return CompletableFuture.completedFuture(false);
}
@Override
public CompletionStage<Boolean> checkPermission(String permissionValue, Optional<String> meta, DeadboltHandler deadboltHandler, Http.Context ctx) {
// Your check goes here
return CompletableFuture.completedFuture(false);
}
}
注意:答案基于Deadbolt 2.6.4。