当网关集成了Spring Security ,是网关的过滤器先,还是Security 的过滤器先?

当网关集成了Spring Security ,是网关的过滤器先,还是Security 的过滤器先?

在 Spring Cloud Gateway (SCG) 与 Spring Security WebFlux 集成时,请求会经历两个独立但串联的过滤链:首先是 Spring WebFlux 的 WebFilterChain(包含由 SecurityWebFilterChain 组成的安全过滤器链),负责身份验证和授权;随后进入 SCG 的 GatewayFilterChain,由所有的 GlobalFilter 与路由级别的 GatewayFilter(以及其有序包装 OrderedGatewayFilter)共同构成,负责路由前(pre)和路由后(post)的请求/响应处理。执行顺序如下:

  1. WebFilterChain(含 Security)

  2. DispatchHandler(路由匹配)

  3. FilteringWebHandler(SCG 的 GlobalFilter + 路由级 GatewayFilter)

  4. 下游服务调用

  5. SCG Post 过滤

  6. 响应逆序通过 WebFilterChain

要在路由前插入自定义逻辑,应实现 WebFilter(而非 GatewayFilter);若需在安全认证阶段前后插入过滤器,可利用 ServerHttpSecurity.addFilterBefore/After(...) 并指定 SecurityWebFiltersOrder

✅ 在 SpringMVC(Servlet)架构下:

  • 所有的过滤器都实现自 javax.servlet.Filter(或 Jakarta EE 的 jakarta.servlet.Filter),是 Servlet 规范定义的标准接口

  • Spring Security 等框架会基于 Filter 构建完整的过滤链,比如:FilterChainProxyDelegatingFilterProxy


✅ 在 Spring WebFlux(Reactive)架构下:

  • 所有的过滤器都实现自 org.springframework.web.server.WebFilter,这是 Spring 自己定义的 Reactive 异步过滤接口

  • Spring Security for WebFlux 会构建 SecurityWebFilterChain,其中每个安全处理器都是 WebFilter 的实现,比如:

    • AuthenticationWebFilter

    • SecurityContextServerWebExchangeWebFilter

    • AuthorizationWebFilter

  • WebFlux 是基于 Reactor 的响应式模型,WebFilter 使用的是 Mono filter(ServerWebExchange exchange, WebFilterChain chain) 方法签名。

实际情况

由于 Gateway 是在WebFlux(Reactive)架构下的,所以我们的security也得在这个架构下,而WebFlux架构下,WebFilter 过滤器链先于 Gateway 的过滤器链执行。在我的项目里面,我在自定义的实现自 WebFilter 的 Jwt过滤器,以及在 Gateway 的全局过滤器 各自打了一个 断点

发现,最先执行的是 DefaultWebFilterChain 这个过滤器,其次是 DefaultGatewayFilterChain 过滤器链。

同学们可以去试一下看。

你可能感兴趣的:(spring,java,后端)