FilterRegistrationBean 是启用具有 Spring 安全性的 CORS 支持所必需的吗?

FilterRegistrationBean necessary to enable CORS support with Spring Security?

我的资源服务器受 OAuth2 保护并使用此 CORS 配置:

@Bean
CorsConfigurationSource corsConfigurationSource()
{
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.setAllowedOrigins(Arrays.asList("*"));
    configuration.setAllowedMethods(Arrays.asList("*"));
    configuration.setAllowedHeaders(Arrays.asList("*"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

@Bean
FilterRegistrationBean<CorsFilter> corsFilter(CorsConfigurationSource corsConfigurationSource)
{
    CorsFilter corsFilter = new CorsFilter(corsConfigurationSource);

    FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>();
    bean.setFilter(corsFilter);
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return bean;
}

配置按预期处理预检请求,但我想知道为什么有必要创建自定义 FilterRegistrationBean 并设置其顺序,而不是使用 HttpSecurity.cors() documented here 的官方 CORS 支持:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.cors();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource()
    {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowCredentials(true);
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

以上配置没有正确处理预检请求,我猜 CORS 过滤器的优先级低于 spring 安全过滤器。

使用第一个FilterRegistrationBean版本有什么缺点吗?为什么官方的cors配置不能正常使用?我是不是官方配置有误?

我正在使用 Spring Boot 2 和 spring-security-oauth2-autoconfigure,但在 Spring Boot 1 中得到了相同的行为。5.x。

你的WebSecurityConfigclass从来没有用于任何请求,因为默认顺序是100,见WebSecurityConfigurerAdapter:

@Order(value=100)
public abstract class WebSecurityConfigurerAdapter
extends java.lang.Object
implements WebSecurityConfigurer<WebSecurity>

资源服务器配置的默认顺序为3,参见EnableResourceServer:

The annotation creates a WebSecurityConfigurerAdapter with a hard-coded Order (of 3).

如果您想使用 WebSecurityConfig class,您必须将顺序更改为小于 3 的值。但要小心,因为您可能会隐藏资源服务器配置。

如果您的应用程序也是授权服务器,您也必须小心。您的授权服务器配置带有 EnableAuthorizationServer could be not used. The default order of authorization server's security configuration is 0, see AuthorizationServerSecurityConfiguration.

注释

如果您只想为您的资源服务器配置添加 CORS 支持,覆盖 ResourceServerConfigurerAdapter#configure(HttpSecurity http).

会更容易