ReactiveFeignClient — как передавать заголовки от контроллера к клиенту без авторизации

#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 принципала.

На самом деле, как я вижу, работа с этим объектом — единственный способ.