
Spring Boot 3.x 默认启用 Spring Security,若未正确配置 SecurityFilterChain,所有请求(包括不存在的路径)均会被拦截并返回 403,而非预期的 404 或成功响应。本文详解如何通过禁用 CSRF、放行请求路径及避免 Bean 冲突来彻底解决该问题。
spring boot 3.x 默认启用 spring security,若未正确配置 `securityfilterchain`,所有请求(包括不存在的路径)均会被拦截并返回 403,而非预期的 404 或成功响应。本文详解如何通过禁用 csrf、放行请求路径及避免 bean 冲突来彻底解决该问题。
在 Spring Boot 3.1+ 中,WebSecurityConfigurerAdapter 已被移除,安全配置必须通过 SecurityFilterChain Bean 实现。你当前代码中存在两个同名 SecurityFilterChain Bean(web() 和 securityFilterChain()),这会导致 Spring 容器注册多个安全链,实际生效的可能是未按预期配置的那个——这是 403 频发的根本原因之一。
✅ 正确配置:仅保留一个 SecurityFilterChain Bean
请完全删除 web(HttpSecurity http) 方法,并修正 securityFilterChain Bean,确保其逻辑清晰、无歧义:
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable) // 明确禁用 CSRF(开发阶段常用)
.authorizeHttpRequests(authz -> authz
.requestMatchers("/api/**").permitAll() // 开放 API 接口
.requestMatchers("/actuator/**").permitAll() // 可选:开放监控端点
.requestMatchers("/", "/error", "/favicon.ico").permitAll()
.anyRequest().authenticated() // 其他请求需认证(可按需调整)
);
return http.build();
}
}⚠️ 关键注意事项:
- ❌ 不要同时定义多个
@Bean SecurityFilterChain方法(如web()和securityFilterChain()),Spring 会随机选取其一,极易导致配置失效;- ✅
requestMatchers("/api/**").permitAll()比anyRequest().permitAll()更安全,避免暴露管理端点;- ? 生产环境切勿无条件
permitAll()所有请求;应基于角色(如.hasAuthority("ROLE_ADMIN"))或路径精细授权;- ? 若使用表单登录或 JWT,需额外配置
formLogin()或jwtAuthenticationConverter(),但本例以快速验证通路为前提,故暂不启用认证流程。
✅ 补充验证:Controller 与依赖一致性
确保 EmployeeController 中引用的服务已正确定义(当前代码中 employeeService 未注入):
@RestController
@CrossOrigin
@RequestMapping("/api/v1/employee")
public class EmployeeController {
private final EmployeeService employeeService; // 推荐 final + 构造注入
public EmployeeController(EmployeeService employeeService) {
this.employeeService = employeeService;
}
@PostMapping("/save")
public String saveEmployee(@RequestBody EmployeeDTO employeeDTO) {
return employeeService.addEmployee(employeeDTO);
}
}同时确认 EmployeeService 已声明为 @Service,且 EmployeeDTO 等类具备无参构造器与 Lombok @Data(或手动 getter/setter),否则 JSON 反序列化失败也可能间接触发安全过滤器的兜底拒绝行为。
✅ 最终检查清单
| 项目 | 检查项 |
|---|---|
✅ SecurityConfig
|
仅含 1 个 @Bean SecurityFilterChain,无废弃方法 |
| ✅ CSRF 配置 | 使用 csrf(AbstractHttpConfigurer::disable)(Spring Boot 3.1+ 语法) |
| ✅ 路径匹配 |
requestMatchers("/api/**").permitAll() 显式覆盖目标接口 |
| ✅ 依赖注入 | Controller 中 employeeService 已正确注入,非 null |
| ✅ 启动日志 | 查看控制台是否输出 o.s.s.web.DefaultSecurityFilterChain 日志,确认链已加载 |
完成上述修改后重启应用,向 POST http://localhost:8080/api/v1/employee/save 发送合法 JSON 请求,即可获得 200 响应。若仍返回 403,请检查浏览器或 Postman 是否携带了旧会话 Cookie(Spring Security 默认启用 session),建议使用无痕模式或清除 Cookie 后重试。
通过规范安全配置粒度、消除 Bean 冲突、明确放行策略,即可彻底摆脱“所有请求都 403”的陷阱,让开发回归高效调试节奏。


















