You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:33:23