CORS春季安全性过滤器vs WebMvcConfigurer.addCorsMappings

问题描述

cors()类的configure方法中的WebSecurityConfigurerAdapter过滤器和创建WebMvcConfigurer的bean并覆盖addCorsMappings方法的区别是什么?当我们使用哪个?有人可以解释吗?

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("http://localhost:3000");
        }
    };
}

vs

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()
                .csrf().disable()
                .authorizeRequests()
                .mvcMatchers("/rest/**").authenticated()
                .anyRequest().permitAll()
                .and()
          .oauth2ResourceServer().jwt().jwtAuthenticationConverter(this.jwtAuthenticationConverter())
        ;
    }

}

解决方法

Spring Web MVC

WebMvcConfigurerSpring Web MVC库的一部分。使用addCorsMappings配置CORS会将CORS添加到Spring Web MVC处理的所有URL中,请参见1.7.2. Processing

Spring MVC HandlerMapping实现为CORS提供内置支持。成功将请求映射到处理程序后,HandlerMapping实现会检查给定请求和处理程序的CORS配置并采取进一步的措施。

如果没有使用Spring Security(非安全应用程序),或者不是所有Spring Web MVC URL都由Spring Security处理(某些ULR是不安全的),则必须使用它。

您不能将其用于非Spring Web MVC URL,例如JSF,Servlet,JAX-WS,JAX-RS,...

Spring Security

WebSecurityConfigurerAdapter Spring Security库的一部分。使用cors()配置CORS会将CORS添加到Spring Security处理的所有URL中,请参见15.8. CORS

Spring框架为CORS提供了一流的支持。必须在Spring Security之前处理CORS,因为飞行前请求将不包含任何cookie(即JSESSIONID)。如果请求中不包含任何cookie,并且首先使用Spring Security,则该请求将确定用户未通过身份验证(因为请求中没有cookie),并拒绝该用户。

确保首先处理CORS的最简单方法是使用CorsFilter

如果使用Spring Security,则必须使用它。

如果同时使用Spring Web MVC和Spring Security,则可以共享配置,请参见15.8. CORS

如果您使用的是Spring MVC的CORS支持,则可以省略指定CorsConfigurationSource,Spring Security将利用提供给Spring MVC的CORS配置。