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

Spring Security配置permitAll后POST请求返回403问题咨询

问题原因

POST请求返回403和.anyRequest().permitAll()的权限配置没有关系,核心是两个Spring Security的默认机制共同作用的结果:

  • 第一,permitAll()仅会放行访问授权校验逻辑,不会跳过过滤器链中前置的其他校验规则。从你贴的过滤器链可以看到,CsrfFilter排在授权逻辑相关过滤器的前面,Spring Security默认开启CSRF防护,会直接拦截所有未携带合法CSRF令牌的POST/PUT/DELETE等非安全语义请求,直接返回403,根本不会走到后续的权限判断环节。这也是GET请求全部正常、无令牌POST直接403的直接原因。
  • 第二,当你配置了OAuth2资源服务器的JWT支持后,Spring Security会自动给CSRF校验加一条豁免规则:只要请求携带Authorization: Bearer 前缀的请求头,就直接跳过CSRF校验。这条规则的触发时机在JWT合法性校验之前,所以哪怕你携带的是过期、格式非法的令牌,只要请求头里带了Bearer标识,CSRF校验就会被绕过,请求就能正常走到接口逻辑。

你注释掉资源服务器配置后,这条CSRF豁免规则会被一起移除,所以哪怕请求带了Bearer头,POST请求依然会因为CSRF校验失败返回403,和你观察到的现象完全吻合。
你之前在其他配置了端点访问保护的项目中没遇到这个问题,通常是因为那些项目要么提前关闭了CSRF,要么测试POST请求时都携带了合法CSRF令牌或Bearer头触发了豁免,和是否配置接口权限拦截没有关联。

修复方式

根据你的业务场景选择配置即可:

  1. 如果你的项目是纯API服务,不依赖Cookie做会话认证(比如前后端分离、对外提供OpenAPI),直接在安全配置中关闭CSRF防护即可,这也是API类项目的通用配置:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
            // 关闭CSRF防护
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests((authorize) -> authorize
                    .mvcMatchers("/swagger-ui/**", "/api-docs/**").permitAll()
                    .anyRequest().permitAll())
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
            .oauth2Client(withDefaults());

    return http.build();
}
  1. 如果你需要保留CSRF防护(比如存在服务端渲染页面、表单登录等基于Cookie的认证场景),可以单独给不需要CSRF校验的公开POST接口配置白名单,不需要全局关闭CSRF。

内容的提问来源于stack exchange,提问作者luso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:48:33