#reactive-programming #webfiltering #reactive-feign-client
#реактивное программирование #веб-фильтрация #реактивный-симулирующий-клиент
Вопрос:
Я получил X-Forwarded-Host
и X-Forwarded-Proto
в своих конечных точках контроллера, а конечная точка имеет реактивный конвейер для вызова класса ReactiveFeignClient.
Эти заголовки должны распространяться на мои клиентские запросы, но, как я вижу, этого не произошло. У меня нет Principal
в этом конвейере, потому что конечным точкам не требуется аутентификация, поэтому я не могу использовать ReactiveSecurityContextHolder.withAuthentication(user)
Я уже добавил a WebFilter
для чтения заголовков из запроса:
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange).subscriberContext((context) -> {
ServerHttpRequest request = exchange.getRequest();
Map<String, String> headers = (Map)request.getHeaders().toSingleValueMap().entrySet().stream().filter((entry) -> {
return ((String)entry.getKey()).equalsIgnoreCase(this.authLibConfig.getXForwardedHostHeader()) || ((String)entry.getKey()).equalsIgnoreCase(this.authLibConfig.getXForwardedProtoHeader());
}).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
System.out.println("Adding all headers now: ");
context.put("headers_to_propagate", headers);
return context;
});
}
Но я не знаю, где в конфигурации клиента я могу извлечь их из Context
и поместить в запросы в клиенте.
Теперь я делаю это: (
@Bean
public ReactiveHttpRequestInterceptor forwardingHeadersInterceptor(ReactiveFeignUtils reactiveFeignUtils) {
return reactiveFeignUtils::mutateRequestHeadersForNoAuthRequests;
}
И:
public Mono<ReactiveHttpRequest> mutateRequestHeadersForNoAuthRequests(ReactiveHttpRequest reactiveHttpRequest) {
return Mono.subscriberContext().doOnNext((context) -> {
System.out.println("Current context: " context.toString());
if (context.hasKey("headers_to_propagate")) {
System.out.println("Getting all host headers: ");
reactiveHttpRequest.headers().putAll((Map)context.get("headers_to_propagate"));
}
}).thenReturn(reactiveHttpRequest);
}
Но заголовки не пересылаются.
Ответ №1:
В итоге я создал настраиваемый класс implementing Authentication
и добавил к нему эти поля в качестве свойства метаданных; потому что, хотя эта конечная точка не требует авторизации, заголовки, связанные с идентификатором участника и другой информацией аутентификации, получены, поэтому я могу создать Authentication
принципала.
На самом деле, как я вижу, работа с этим объектом — единственный способ.