Spring Webflux и Spring Cloud Gateway: как извлечь объект в Mono и добавить в заголовок запроса

В настоящее время я использую Spring Cloud Gateway, используя пользовательскую аутентификацию JWT. После аутентификации я хочу передать строку токена JWT в заголовке нижестоящей службе с помощью GlobalFilter:

public class AddJwtHeaderGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        Mono<Principal> principal = exchange.getPrincipal();


        String jwtString = extract(principal);

        ServerHttpRequest request = exchange.getRequest()
                .mutate()
                .header("Authorization", new String[]{jwtString})
                .build();
        ServerWebExchange newExchange = exchange.mutate().request(request).build();
        return chain.filter(newExchange);
    }

    // how to implement this method in order to get a String type of jwt token?
    private String extract(Mono<Principal> principal) {
        //need to call getJwtString(Principal) and return the jwt string
        return null;
    }

    private String getJwtString(Principal principal) {
        return principal.getName();
    }

    @Override
    public int getOrder() {
        return HIGHEST_PRECEDENCE;
    }
}

Строку токена JWT можно получить, вызвав метод Principal.getName();

Мой вопрос: как я могу реализовать метод String extract(Mono<Principal> principal) для преобразования строки токена Mono в JWT при добавлении строки токена в качестве заголовка? Или мой способ использования Mono в корне неверен?


person Yun Teng    schedule 23.11.2019    source источник


Ответы (1)


Привязавшись к своему Mono, а затем объявите, что вы хотите сделать.

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) 
{
    return exchange.getPrincipal().flatMap(principal -> {

        // Do what you need to do

        return chain.filter( ... );
    });
}
person Toerktumlare    schedule 23.11.2019
comment
Через полдня, наконец, узнаю, как с ним работать. Но не могли бы вы объяснить, почему exchange.getPrincipal().log().subscribe() не работает? Это пустой моно. - person vahidreza; 09.02.2020
comment
вы не должны подписываться в приложении webflux. абонент - это тот, кто инициировал вызов, он же. вызывающий клиент. - person Toerktumlare; 09.02.2020