Получение SecurityContextHolder в предварительном фильтре Spring Cloud Gateway

Я использую Spring Cloud Gateway и Spring Security в проекте Spring Boot (версия 2.2.6). У меня есть настраиваемый предварительный фильтр, который должен добавлять заголовки к запросу, прежде чем он переадресует запрос нижестоящим службам. Предварительный фильтр должен прочитать объект аутентификации Spring Security, чтобы получить полномочия, прежде чем он сможет добавить заголовки (ему необходимо выполнить некоторый поиск на основе полномочий). Поскольку Spring Cloud Gateway является реактивным, я не могу использовать статический класс SecurityContextHolder. Ссылаясь на этот вопрос Stackoverflow, ReactiveSecurityContextHolder.getContext () пуст, но работает @AutContext (). >, Я попробовал следующее в моем настраиваемом предварительном фильтре:

ReactiveSecurityContextHolder.getContext().map(ctx -> ctx.getAuthentication()).block()

Как опубликовано OP, он не работает и возвращает значение null. Было несколько предложений по созданию настраиваемого фильтра в этой проблеме с stackoverflow. Но я не пробовал, так как хочу получить доступ к объекту аутентификации из настраиваемого фильтра. Нет ли прямого способа получить объект аутентификации в настраиваемом фильтре Spring Cloud Gateway?

Спасибо


person sgsd    schedule 10.05.2020    source источник


Ответы (1)


Приведенный ниже фрагмент кода представляет собой простой пример фильтра, который обеспечивает доступ к контексту аутентификации:

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    Mono<Void> monoFilter = ReactiveSecurityContextHolder.getContext().map(sc -> sc.getAuthentication())
            .flatMap(authentication -> {

                // here you can access to Authentication object
                // and implement the pre-filter logic

                return chain.filter(exchange);

            });

    return monoFilter;
}
person Claudio Tasso    schedule 26.02.2021