Spring Boot 3.3.0升级至3.3.11后Spring Security的CORS处理行为变化咨询
Spring Boot 3.3.0升级至3.3.11后Spring Security的CORS处理行为变化咨询
老哥,我刚好对Spring Security 6.3.x的CORS变更门儿清,来给你捋捋你碰到的问题:
核心的行为变更点
你碰到的OPTIONS请求被拦截,确实是Spring Security 6.3.x的有意框架变更,不是你漏了什么配置步骤,核心变化有这几个:
- 预检请求(OPTIONS)默认处理:之前版本会自动放行所有OPTIONS请求,不需要额外配置;但6.3.x之后,默认不再自动放行,必须显式配置CORS规则或者通过安全链放行,否则会被拦截。
http.cors()的应用逻辑:之前http.cors()只是简单启用CORS过滤器,即使你没自定义CorsConfigurationSource,它会用一个宽松的默认配置;现在它要求你必须明确提供CORS配置(自定义CorsConfigurationSourceBean),否则启用后也不会生效,还是会拦截预检请求。- CorsFilter和SecurityFilterChain的交互:之前CorsFilter可能在安全链之前独立执行,现在它被完全整合到SecurityFilterChain内部了——也就是说,如果你没在安全链里启用
http.cors(),CorsFilter根本不会触发,自然处理不了预检请求。
快速恢复&推荐配置方案
根据你的情况,有两种处理方式:
1. 快速临时恢复(适合验证问题)
直接在SecurityFilterChain里显式放行所有OPTIONS请求,代码如下:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() // 显式放行OPTIONS .anyRequest().authenticated() ) // 其他你的原有配置,比如csrf、formLogin等 return http.build(); }
2. 规范配置(推荐长期使用)
按照6.3.x的要求,正确定义CORS配置并绑定到安全链,这是框架推荐的做法,也更安全:
首先定义CorsConfigurationSource Bean:
@Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); // 替换成你的前端实际域名,带凭证的请求不支持用* config.setAllowedOrigins(Arrays.asList("https://your-frontend-domain.com")); config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); config.setAllowedHeaders(Arrays.asList("*")); // 如果需要携带Cookie或认证头,必须开启这个 config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 对所有路径应用这个配置 source.registerCorsConfiguration("/**", config); return source; }
然后在SecurityFilterChain里启用CORS:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .cors(withDefaults()) // 启用CORS,自动绑定上面的CorsConfigurationSource .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) // 其他你的原有配置 return http.build(); }
为什么会有这个变更
Spring Security团队做这个变更是为了提升默认安全性——之前的自动放行OPTIONS和隐式宽松配置,可能导致开发者无意中开放了过宽的跨域权限,带来安全风险。现在要求显式配置,就是为了让开发者明确控制跨域规则,避免无意识的安全漏洞。
验证方法
你可以用curl发个测试请求验证配置是否生效:
curl -X OPTIONS http://your-backend-url/api/your-endpoint \ -H "Origin: https://your-frontend-domain.com"
如果配置正确,会返回200状态码,并且响应头里会有Access-Control-Allow-Origin等CORS相关头。
要是还有疑问,或者配置后还是有问题,随时说细节我再帮你排查~




