Весенний облачный шлюз добавляет заголовок из проверки подлинности

#spring #spring-security #spring-webflux #spring-cloud-gateway

Вопрос:

Клиент выбрал маршрут на моем spring cloud gateway 2 со своим сертификатом. Я успешно аутентифицирую клиента с помощью аутентификации x509, затем, прежде чем перенаправлять запрос в нижестоящую службу, я хотел бы добавить имя участника в заголовок cutom запроса.

Я создал свой фильтр, но не могу ввести имя участника в значение заголовка.

Вот моя реализация метода применения фильтра шлюза

 @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() создает исключение… Есть какие-нибудь предложения?

Ответ №1:

Решенный. Я обнаружил, что 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 withBearerAuth(ServerWebExchange exchange, String clientName) {  return exchange.mutate()  .request(r -> r.headers(headers -> headers.add("X-client-name", clientName)).build();  }  

Это работает как заклинание!!