我的目标是从常规 CORS 配置中排除特定控制器,以缩小端点允许的地址列表。 我有这样的cors配置:
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(of(
"addr1",
"addr2",
"addr3"
));
因此,所有这些地址都允许到达应用程序中的所有我的端点。我想以这种方式配置 CORS,特定控制器将拒绝来自 addr1、addr2 的请求,但仍允许 addr3 执行请求。
我已添加到该控制器
@CrossOrigin(origins = {"http://addr3", "https://addr3"})
public SpecificControllerForAddr3 {
并从常规配置中删除了 addr3。但我仍然可以到达从 addr2 到该控制器的端点。
我认为这不是我需要的,因为一般配置仍然将此控制器置于其基本 cors 配置中。
如何从常规 CORS 配置中排除此控制器?
如果要使用多个CORS配置,则必须使用多个安全过滤器链,参见Spring安全参考:
如果您有多个
bean,Spring Security 不会自动为您配置 CORS 支持,这是因为它无法决定使用哪一个。如果您想为每个CorsConfigurationSource
指定不同的CorsConfigurationSource
,您可以将其直接传递到SecurityFilterChain
DSL。.cors()
@Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean @Order(0) public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception { http .securityMatcher("/api/**") .cors((cors) -> cors .configurationSource(apiConfigurationSource()) ) ... return http.build(); } @Bean @Order(1) public SecurityFilterChain myOtherFilterChain(HttpSecurity http) throws Exception { http .cors((cors) -> cors .configurationSource(myWebsiteConfigurationSource()) ) ... return http.build(); } CorsConfigurationSource apiConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("https://api.example.com")); configuration.setAllowedMethods(Arrays.asList("GET","POST")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } CorsConfigurationSource myWebsiteConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(Arrays.asList("https://example.com")); configuration.setAllowedMethods(Arrays.asList("GET","POST")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; } }