使用Spring Security启用CORS是否需要FilterRegistrationBean?
其实完全没必要非得用FilterRegistrationBean来启用Spring Security的CORS支持,Spring Security本身就提供了更贴合场景的集成方式,尤其是你的OAuth2资源服务器场景,我给你捋捋几种可行的方案:
1. 推荐方式:直接集成到Spring Security配置中
你已经定义了CorsConfigurationSource bean,只需要在SecurityFilterChain配置里通过.cors()方法关联它就行,Spring Security会自动帮你处理CORS过滤器的注册和顺序问题,确保它在安全校验之前执行(这很关键,不然预检OPTIONS请求会被安全拦截)。
示例代码:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 先配置CORS,顺序要放在其他安全规则前面 .cors(cors -> cors.configurationSource(corsConfigurationSource())) .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter())) ); return http.build(); }
这种方式比手动注册Filter要省心得多,框架已经帮你搞定了过滤器顺序的坑,不用自己操心。
2. 什么时候需要用FilterRegistrationBean?
只有当你有特殊需求时才需要考虑,比如:
- 你需要自定义CORS过滤器的执行优先级,且不想依赖Spring Security的过滤器链顺序
- 你需要在非Spring Security管理的路径上单独配置CORS
如果一定要用,记得把过滤器的优先级设为最高,确保它比Spring Security的过滤器先执行,示例代码:
@Bean public FilterRegistrationBean<CorsFilter> corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.setAllowedOrigins(Arrays.asList("*")); config.setAllowedMethods(Arrays.asList("*")); config.setAllowedHeaders(Arrays.asList("*")); source.registerCorsConfiguration("/**", config); FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source)); // 设置最高优先级,确保在Spring Security过滤器之前执行 bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; }
但说实话,这种方式在你的OAuth2资源服务器场景下完全是多此一举。
3. 注意点:单独的CORS配置可能失效
如果你只定义了CorsConfigurationSource但没和Spring Security集成,那大概率会出现预检请求被拦截的问题——因为Spring Security的过滤器会先于CORS过滤器执行,OPTIONS请求还没被允许跨域就被安全校验拦住了。所以必须让CORS的处理逻辑在安全校验之前,而集成到Spring Security配置里是最稳妥的方式。
总结一下:对于你的OAuth2资源服务器,直接在SecurityFilterChain里用.cors()关联你的CorsConfigurationSource就足够了,完全不需要FilterRegistrationBean。
内容的提问来源于stack exchange,提问作者sn42

