You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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配置(自定义CorsConfigurationSource Bean),否则启用后也不会生效,还是会拦截预检请求。
  • 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相关头。

要是还有疑问,或者配置后还是有问题,随时说细节我再帮你排查~

火山引擎 最新活动