ReactiveFeignClient-如何在没有身份验证的情况下将标头从控制器传播到客户端



我在控制器端点中收到了X-Forwarded-HostX-Forwarded-Proto,端点有一个反应管道来调用ReactiveFeignClient类。

这些头应该传播到我的客户端请求,但在我看来,它没有。我在这个管道中没有Principal,因为端点不需要身份验证,所以我不能使用ReactiveSecurityContextHolder.withAuthentication(user)

我已经添加了一个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);
}

但不转发任何标头。

我最终创建了一个实现Authentication的自定义类,并将这些字段作为元数据属性添加到其中;因为即使这个端点不需要身份验证,也会接收到与成员id和其他身份验证信息相关的头,所以我可以构造Authentication主体。

事实上,在我看来,处理这个对象是唯一的方法。

最新更新