在 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的NettyConfiguration