在 Spring Cloud Gateway 预过滤器中获取 SecurityContextHolder

Posted

技术标签:

【中文标题】在 Spring Cloud Gateway 预过滤器中获取 SecurityContextHolder【英文标题】:Getting SecurityContextHolder in Spring Cloud Gateway Pre Filter 【发布时间】:2020-08-26 02:36:13 【问题描述】:

我在 Spring Boot 项目(版本 2.2.6)中使用 Spring Cloud Gateway 和 Spring Security。我有一个自定义的 Pre 过滤器,它需要在将请求转发到下游服务之前向请求添加标头。 Pre 过滤器需要读取 Spring Security 的 Authentication 对象以获取权限,然后才能添加标头(它需要根据权限进行一些查找)。由于 Spring Cloud Gateway 是反应式的,我不能使用静态 SecurityContextHolder 类。参考这个 *** 问题ReactiveSecurityContextHolder.getContext() is empty but @AuthenticationPrincipal works,我在我的自定义前置过滤器中尝试了以下操作:

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

正如 OP 发布的那样,它不起作用并返回 null。有一些关于在那个 *** 问题中创建自定义过滤器的建议。但我没有尝试过,因为我想从自定义过滤器访问 Authentication 对象。 Spring Cloud Gateway自定义过滤器中是否没有直接获取Authentication对象的方法?

谢谢

【问题讨论】:

【参考方案1】:

下面的代码 sn-p 是一个简单的过滤器示例,它提供对身份验证上下文的访问:

@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;

【讨论】:

以上是关于在 Spring Cloud Gateway 预过滤器中获取 SecurityContextHolder的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway 某些路由中跳过全局过滤器

spring cloud gateway 的执行流程

聊聊spring cloud gateway的NettyConfiguration

Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

Spring Cloud Gateway集成

在同一个项目中实现 Spring Cloud Gateway