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主体。

实际上,正如我所见,使用此对象是唯一的方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...