#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(); }
Это работает как заклинание!!