Как написать фильтр WebFlux, который должен передать Rest body для вызова службы авторизации - PullRequest
0 голосов
/ 07 марта 2020

Мне нужно реализовать фильтр авторизации для приложения весенней загрузки WebFlux. Чтобы вызвать сервис авторизации, мне нужно получить url, queryParam, заголовки и тело. Я могу получить первые 3 свойства из ServerRequest функции HandlerFilterFunction, однако у меня есть проблема с телом. Для вызова авторизации требуются все четыре параметра:

 Principal authorization(String method,Sting requestUrl,Map<String, ListValue> headersMap, String body) throws ServiceException

Метод выдает исключение, если пользователь не авторизован для выполнения метода, в противном случае возвращает основной объект.

Метод никогда не вызывается при выполнении фильтра потому что у меня нет подписчика на моно объект:

public class WebFluxAuthorizationFilter implements HandlerFilterFunction<ServerResponse, ServerResponse> {
  @Override

  public Mono<ServerResponse> filter(ServerRequest request, HandlerFunction<ServerResponse> handlerFunction) {

    String method = request.methodName();
    String requestUrl = request.uri().toString();
    HttpHeaders headers = request.headers().asHttpHeaders();
    Map<String, ListValue> headersMap =  new HashMap<>();
    for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
        ListValue grpcList = toListValue(entry.getValue());
        headersMap.put(entry.getKey(), grpcList);
    }
    Mono<Principal> mono = request.bodyToMono(String.class)
            .flatMap(body -> {
                return Mono.just(authorization(method, requestUrl, headersMap, body));
            });
    return handlerFunction.handle(request);
}

У меня та же проблема, если я использую WebFilter вместо HandlerFilterFunction
Что мне нужно сделать, чтобы получить доступ к телу и запустить метод авторизации, как показано над ? Текущий код не вызывает authorization (), потому что лямбда-тело -> ... никогда не вызывается. Пожалуйста, дайте мне знать, как должен быть написан фильтр, чтобы получить тело и использовать его во время выполнения фильтра.

...