配置Spring Boot 3(含Spring MVC&Security7)实现带凭证的CORS公开访问
Spring Boot 3 + Spring Security 满足指定CORS需求的最佳配置方案
一、核心配置实现
1. CORS全局配置类
创建全局CORS配置Bean,适配Spring Boot 3的API规范,同时满足允许所有主机、支持凭证的要求:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @Configuration public class CorsConfig { @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); // 允许所有来源(符合CORS规范,支持凭证时不能直接用addAllowedOrigin("*")) config.addAllowedOriginPattern("*"); // 允许所有HTTP请求方法 config.addAllowedMethod("*"); // 允许所有请求头 config.addAllowedHeader("*"); // 开启凭证支持(适配Bearer令牌等场景) config.setAllowCredentials(true); // 暴露前端需要获取的响应头(如Authorization) config.addExposedHeader("Authorization"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 对所有API路径应用该配置 source.registerCorsConfiguration("/**", config); return source; } }
2. Spring Security 过滤链配置
将CORS过滤器加入Security过滤链,确保CORS校验优先于其他Security规则执行:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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.web.cors.CorsConfigurationSource; @Configuration @EnableWebSecurity public class SecurityConfig { private final CorsConfigurationSource corsConfigurationSource; public SecurityConfig(CorsConfigurationSource corsConfigurationSource) { this.corsConfigurationSource = corsConfigurationSource; } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 优先配置CORS,必须放在csrf、权限控制之前 .cors(cors -> cors.configurationSource(corsConfigurationSource)) // 关闭CSRF(按需求配置) .csrf(csrf -> csrf.disable()) // 按需配置权限规则,示例为允许所有请求,实际请根据业务调整 .authorizeHttpRequests(auth -> auth .anyRequest().permitAll() ); return http.build(); } }
二、关键注意事项
addAllowedOriginPatternvsaddAllowedOrigin:当开启凭证支持(setAllowCredentials(true))时,CORS规范禁止使用Access-Control-Allow-Origin: *,因此必须用addAllowedOriginPattern("*")来实现允许所有来源同时兼容凭证的需求,这是Spring Boot 3适配规范的新写法。- 过滤链顺序:CORS配置必须在Security的csrf、权限控制之前声明,否则请求会被Security先拦截,导致CORS响应头无法正确返回。
三、集中配置 vs 方法/控制器注解的选择
1. 集中配置(优先推荐)
适合常规API场景:
- 统一管理所有API的CORS规则,避免重复代码,维护成本极低。
- 适配本题中"允许公开通用访问"的需求,一次配置覆盖所有路径。
- 规则变更时只需修改一处,无需逐个调整控制器。
2. 注解方式(@CrossOrigin)
适合特殊场景:
- 当个别API需要自定义CORS规则(比如仅允许特定域名访问)时,可在控制器或方法上添加
@CrossOrigin注解,注解配置会覆盖全局规则。 - 适合快速测试或局部调整,但大量使用会导致代码冗余,不利于统一维护。
总结:常规API优先采用集中配置,特殊需求API结合@CrossOrigin做局部调整即可。
内容的提问来源于stack exchange,提问作者Jules
相关产品推荐
相关产品推荐

