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头触发了豁免,和是否配置接口权限拦截没有关联。
修复方式
根据你的业务场景选择配置即可:
- 如果你的项目是纯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(); }
- 如果你需要保留CSRF防护(比如存在服务端渲染页面、表单登录等基于Cookie的认证场景),可以单独给不需要CSRF校验的公开POST接口配置白名单,不需要全局关闭CSRF。
内容的提问来源于stack exchange,提问作者luso
相关产品推荐
相关产品推荐

