Spring Boot OAuth2环境下CSRF防护配置失效问题咨询
你遇到的问题核心是Spring Security 6.x对OAuth2资源服务器的默认CSRF防护策略,具体原因如下:
默认跳过Bearer Token请求的CSRF校验
Spring Security默认认为,Bearer Token通常存储在前端内存而非Cookie中,CSRF攻击无法通过伪造请求窃取内存中的Token,因此会对携带Bearer Token的请求自动跳过CSRF验证。这个内置规则优先级高于你手动配置的CookieCsrfTokenRepository,所以Postman仅携带Bearer Token就能绕过CSRF校验。配置优先级冲突
你配置的CSRF Token仓库会被资源服务器的默认过滤器链覆盖。当请求携带Bearer Token时,OAuth2资源服务器的过滤器会先识别并处理,直接跳过后续的CSRF校验步骤,导致你的CSRF配置失效。前端正常的原因
Angular发起的请求会自动携带Cookie中的XSRF Token(因为你设置了withHttpOnlyFalse()),同时浏览器会自动附带Cookie,此时请求既包含Bearer Token,也包含CSRF Token相关的Cookie和请求头,符合你配置的校验规则,所以流程正常。但Postman未携带这些Cookie和头,却因Bearer Token的存在被框架跳过了CSRF检查。
如果你确实需要对Bearer Token请求强制开启CSRF防护(比如场景中存在XSS漏洞可能窃取Token,或者Token被存储在Cookie中),可以通过显式覆盖默认的忽略规则实现:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // 取消对任何请求的CSRF忽略,强制所有请求校验 .ignoringRequestMatchers(request -> false) ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(Customizer.withDefaults()) ); return http.build(); } }
注意:强制开启后,所有请求(包括Postman的Bearer Token请求)都需要携带有效的CSRF Token才能通过校验,要确保你的客户端(包括测试用的Postman)能正确获取并携带CSRF Token。
内容的提问来源于stack exchange,提问作者newhouse

