如何在 Spring Boot 中从 CORS 配置中排除特定端点?

问题描述 投票:0回答:1

我的目标是从常规 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 配置中排除此控制器?

java spring spring-boot spring-security cors
1个回答
0
投票

如果要使用多个CORS配置,则必须使用多个安全过滤器链,参见Spring安全参考

如果您有多个

CorsConfigurationSource
bean,Spring Security 不会自动为您配置 CORS 支持,这是因为它无法决定使用哪一个。如果您想为每个
CorsConfigurationSource
指定不同的
SecurityFilterChain
,您可以将其直接传递到
.cors()
DSL。

@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;
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.