【发布时间】:2018-08-31 15:23:00
【问题描述】:
我的资源服务器受 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 安全过滤器。
使用第一个 FilterRegistrationBean 版本是否有缺点,或者为什么官方的 cors 配置不能正常工作?是不是我配置官方的方式出错了?
我正在使用带有 spring-security-oauth2-autoconfigure 的 Spring Boot 2,但在 Spring Boot 1.5.x 中得到了相同的行为。
【问题讨论】:
-
@dur 谢谢你的评论。你是对的,我使用了 100 的默认顺序,改变它会导致预期的行为。如果你喜欢写一个答案,我会接受。您对特定订单价值有什么建议吗?或者Ordered.HIGHEST_PRECEDENCE 是要走的路吗?
-
刚刚找到here的信息:EnableResourceServer注解创建了一个硬编码Order为3的WebSecurityConfigurerAdapter,猜下面的任何值都可以。
标签: java spring spring-security cors preflight