Spring Security配置Basic Auth POST请求403 关闭CSRF认证失效解决方法
问题原因
当你自定义SecurityFilterChain Bean后,Spring Security默认的自动装配逻辑会直接失效——包括读取application.properties中配置的默认账号密码、默认的HTTP Basic认证拦截规则都不会再生效。你之前的配置仅做了跨域放行、CSRF关闭,没有显式配置请求鉴权规则和Basic认证逻辑,因此所有接口可以被匿名直接访问。
正确配置方案
不需要删除application.properties中已配置的spring.security.user.name和spring.security.user.password参数,只需要修改WebSecurityConfig类,在关闭CSRF的同时显式声明请求授权规则、开启HTTP Basic认证即可。
修正后的配置代码如下:
import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; import org.springframework.context.annotation.Bean; @EnableWebSecurity public class WebSecurityConfig { @Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .cors().and() // 关闭CSRF:纯后端API服务、前后端分离场景可直接关闭;如果是服务端渲染表单页面,建议保留CSRF并在POST请求中携带合法CSRF Token .csrf().disable() // 配置所有请求都需要完成认证才可访问 .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) // 显式开启HTTP Basic认证,会自动读取配置文件中的默认账号密码 .httpBasic(Customizer.withDefaults()); return http.build(); } }
注:上述写法兼容Spring Boot 2.x、Spring Boot 3.x版本,3.x版本中必须引入
Customizer类完成配置。
替代方案说明
- 如果你不想自定义
SecurityFilterChain,可以直接删除你写的WebSecurityConfig类,在发起POST请求时携带框架生成的合法CSRF Token,即可避免403错误。但对于非浏览器调用的API服务来说,关闭CSRF是行业通用做法,维护成本更低。 - 你也可以选择删除
application.properties中的静态账号配置,在配置类中自定义UserDetailsServiceBean实现动态用户校验,不影响上述Basic Auth配置的生效逻辑。
内容的提问来源于stack exchange,提问作者iank
相关产品推荐
相关产品推荐

