在deadbolt中使用动态权限时如何获取控制器参数的值

时间:2018-06-12 09:21:06

标签: java playframework authorization deadbolt-2 deadbolt

我在我的控制器上使用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年前,我有点希望能有更清洁的方法来做到这一点。

1 个答案:

答案 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。