我的资源服务器受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过滤器的优先级低于弹簧安全过滤器。
使用第一个FilterRegistrationBean版本是否有缺点或为什么官方的cors配置无法正常工作?我在配置正式方法时犯了错误吗?
我使用的是spring-security-oauth2-autoconfigure
的Spring Boot 2,但在Spring Boot 1.5.x中也有相同的行为。
答案 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)
。