Как получить значение параметра контроллера при использовании динамических разрешений в deadbolt - PullRequest
0 голосов
/ 12 июня 2018

Я использую динамическое разрешение в Deadbolt 2 на моем контроллере, чтобы проверить, есть ли у пользователя доступ к ресурсу или нет.Этот ресурс имеет идентификатор, и в моем контроллере у меня есть метод getById(String id).Выглядит так:

@Dynamic("checkAccess")
public CompletionStage<Result> getById(String id) {
    //Go get my item from DB
}

В моем пользовательском обработчике ресурсов в Deadbolt я хотел бы использовать строку id, передаваемую методу при вызове (например, чтобы проверить, есть ли у текущего пользователя право собственности).этого конкретного элемента, обозначенного идентификатором).

Идентификатор присутствует как минимум в двух местах: мой URL-адрес, как параметр маршрута и как аргумент при вызове метода.Как я могу получить доступ к этому идентификатору в моем контроллере динамических разрешений:

 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);
            }
        }));

Я нашел кое-что об этой проблеме здесь , но это довольно странно, и это было 6 лет назад, я как бынадеясь на более чистый способ сделать это.

1 Ответ

0 голосов
/ 06 августа 2018

Если вы используете свой собственный 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.

...