使用Spring Security启用CORS支持所需的FilterRegistrationBean?

时间:2018-03-22 09:03:09

标签: java spring spring-security cors preflight

我的资源服务器受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()文档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过滤器的优先级低于弹簧安全过滤器。

enter image description here

使用第一个FilterRegistrationBean版本是否有缺点或为什么官方的cors配置无法正常工作?我在配置正式方法时犯了错误吗?

我使用的是spring-security-oauth2-autoconfigure的Spring Boot 2,但在Spring Boot 1.5.x中也有相同的行为。

1 个答案:

答案 0 :(得分:2)

您的WebSecurityConfig课程从未用于任何请求,因为默认顺序为100,请参阅WebSecurityConfigurerAdapter

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

且资源服务器配置的默认顺序为3,请参阅EnableResourceServer

  

注释会创建一个带有硬编码WebSecurityConfigurerAdapter(3)的Order

如果要使用WebSecurityConfig类,则必须将顺序更改为小于3的值。但请注意,因为您可以隐藏资源服务器配置。

如果您的应用程序也是授权服务器,您也必须小心。您的授权服务器配置可能未使用EnableAuthorizationServer注释。授权服务器安全配置的默认顺序为0,请参阅AuthorizationServerSecurityConfiguration

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