FilterRegistrationBean 是启用具有 Spring 安全性的 CORS 支持所必需的吗?
FilterRegistrationBean necessary to enable CORS support with Spring Security?
我的资源服务器受 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() documented 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 Boot 2 和 spring-security-oauth2-autoconfigure
,但在 Spring Boot 1 中得到了相同的行为。5.x。
你的WebSecurityConfig
class从来没有用于任何请求,因为默认顺序是100,见WebSecurityConfigurerAdapter
:
@Order(value=100)
public abstract class WebSecurityConfigurerAdapter
extends java.lang.Object
implements WebSecurityConfigurer<WebSecurity>
资源服务器配置的默认顺序为3,参见EnableResourceServer
:
The annotation creates a WebSecurityConfigurerAdapter
with a hard-coded Order
(of 3).
如果您想使用 WebSecurityConfig
class,您必须将顺序更改为小于 3 的值。但要小心,因为您可能会隐藏资源服务器配置。
如果您的应用程序也是授权服务器,您也必须小心。您的授权服务器配置带有 EnableAuthorizationServer
could be not used. The default order of authorization server's security configuration is 0, see AuthorizationServerSecurityConfiguration
.
注释
如果您只想为您的资源服务器配置添加 CORS 支持,覆盖 ResourceServerConfigurerAdapter#configure(HttpSecurity http)
.
会更容易
我的资源服务器受 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() documented 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 Boot 2 和 spring-security-oauth2-autoconfigure
,但在 Spring Boot 1 中得到了相同的行为。5.x。
你的WebSecurityConfig
class从来没有用于任何请求,因为默认顺序是100,见WebSecurityConfigurerAdapter
:
@Order(value=100) public abstract class WebSecurityConfigurerAdapter extends java.lang.Object implements WebSecurityConfigurer<WebSecurity>
资源服务器配置的默认顺序为3,参见EnableResourceServer
:
The annotation creates a
WebSecurityConfigurerAdapter
with a hard-codedOrder
(of 3).
如果您想使用 WebSecurityConfig
class,您必须将顺序更改为小于 3 的值。但要小心,因为您可能会隐藏资源服务器配置。
如果您的应用程序也是授权服务器,您也必须小心。您的授权服务器配置带有 EnableAuthorizationServer
could be not used. The default order of authorization server's security configuration is 0, see AuthorizationServerSecurityConfiguration
.
如果您只想为您的资源服务器配置添加 CORS 支持,覆盖 ResourceServerConfigurerAdapter#configure(HttpSecurity http)
.