客户端使用其证书在我的spring cloud网关2上点击了一条路由。我用x509身份验证成功地验证了客户端,然后,在将请求转发给下游服务之前,我想将主体名称添加到请求的自定义标头中。
我已经创建了我的过滤器,但是我无法将主体名称放入标题值。
这是我的网关过滤器应用方法实现
@Override
public GatewayFilter apply(Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Mono<String> clientName = ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.map(Authentication::getName);
String headerValue = getClientNameFromMono(clientName);
ServerHttpRequest request = exchange.getRequest().mutate()
.headers(httpHeaders -> httpHeaders.add("X-Client-name", headerValue)).build();
return chain.filter(exchange.mutate().request(request).build());
}
问题是如何正确设置headervalue, clientName.block()抛出异常…任何建议吗?
解决。我发现TokenRelayGatewayFilterFactory
的一些功能非常接近我的需求。以下是我所做的:
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> exchange.getPrincipal()
.map(Principal::getName)
.map(clientName -> withCustomHeader(exchange, clientName))
.defaultIfEmpty(exchange).flatMap(chain::filter);
}
private ServerWebExchange withCustomHeader(ServerWebExchange exchange, String clientName) {
return exchange.mutate()
.request(r -> r.headers(headers -> headers.add("X-client-name", clientName)).build();
}
它像一个魅力!!