Spring Boot 3.2.1网关CSRF令牌未找到问题求助
Spring Cloud Gateway + Spring Security 6 CSRF禁用后仍报错的排查方案
核心原因分析
你的问题大概率是以下场景导致的:
- Spring Cloud Gateway基于**WebFlux(响应式)**架构,但你使用了传统Servlet型的Spring Security配置,导致自定义配置未生效,网关仍采用默认的响应式Security规则(默认开启CSRF)
- Gateway自带的Security自动配置优先级高于你的自定义配置
- 网关路由配置中额外启用了CSRF相关过滤器
具体解决步骤
1. 修正Security配置类(必须用响应式配置)
删除原有的Servlet型Security配置,改用WebFlux专用的响应式配置:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @Configuration @EnableWebFluxSecurity public class GatewaySecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http .csrf(csrfSpec -> csrfSpec.disable()) // 显式禁用CSRF .authorizeExchange(authorize -> authorize // 根据你的业务需求调整权限规则,示例为允许所有请求 .anyExchange().permitAll() ); return http.build(); } }
2. 排除Gateway自带的Security自动配置
如果自定义配置仍未覆盖默认规则,在启动类中排除自动配置类:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; @SpringBootApplication(exclude = {ReactiveSecurityAutoConfiguration.class, SecurityAutoConfiguration.class}) public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
3. 检查网关路由配置
打开application.yml或application.properties,确保没有启用CSRF相关的默认过滤器:
spring: cloud: gateway: # 确保default-filters中没有CsrfHeaderFilter或其他CSRF相关配置 default-filters: []
4. 验证配置生效
启动应用后,查看日志,搜索关键词SecurityWebFilterChain,确认加载的是你自定义的GatewaySecurityConfig中的配置,而非默认配置。
内容的提问来源于stack exchange,提问作者sachin nirne
相关产品推荐
相关产品推荐

