Spring Security Spring云网关从身份验证添加标头

zynd9foi  于 2023-02-23  发布在  Spring
关注(0)|答案(1)|浏览(168)

一个客户端用它的证书在我的spring cloud gateway 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());
}

问题是如何正确设置头值,clientName.block()抛出异常...有什么建议吗?

wkftcu5l

wkftcu5l1#

解决了。我发现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();
}

它的工作原理就像一个魅力!

相关问题