有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我的资源服务器由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过滤器的性能低于spring安全过滤器

enter image description here

使用第一个FilterRegistrationBean版本是否有缺点,或者为什么官方的cors配置不能正常工作?我在配置官方方式时出错了吗

我将Spring Boot 2与spring-security-oauth2-autoconfigure一起使用,但在Spring Boot 1.5中得到了相同的行为。x


共 (1) 个答案

  1. # 1 楼答案

    您的WebSecurityConfig类从未用于任何请求,因为默认顺序为100,请参见^{}

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

    资源服务器配置的默认顺序是3,请参见^{}

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

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

    如果你的应用程序也是一个授权服务器,你也必须小心。无法使用带有^{}注释的授权服务器配置。授权服务器安全配置的默认顺序为0,请参见^{}

    如果您只想将CORS支持添加到资源服务器配置中,那么重写^{}就更容易了