Мне нужно реализовать фильтр авторизации для приложения весенней загрузки 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 (), потому что лямбда-тело -> ... никогда не вызывается. Пожалуйста, дайте мне знать, как должен быть написан фильтр, чтобы получить тело и использовать его во время выполнения фильтра.