gpt4 book ai didi

java - 如何为不同的 URL 堆叠 CORS 过滤器?

转载 作者:行者123 更新时间:2023-12-02 01:47:47 25 4
gpt4 key购买 nike

我有一个 Spring Boot 2 REST API 作为我的 React 应用程序的后端。该网站和 API 托管在不同的子域(分别为 https://example.comhttps://api.example.com),因此我设置了CORS 过滤器支持此功能:

@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

CorsConfiguration apiCorsConfig = new CorsConfiguration();
apiCorsConfig.addAllowedOrigin("https://example.com");
apiCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
apiCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
apiCorsConfig.setMaxAge(600L);
source.registerCorsConfiguration("/**", apiCorsConfig);

FilterRegistrationBean filterRegistrationBean =
new FilterRegistrationBean<>(new CorsFilter(source));
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}

这工作得很好。


我现在已经实现了 Spring SAML 以支持 SAML 作为针对 API 进行身份验证的替代方法。所有 SAML 端点都放置在 /saml/** 下。 SAML 身份验证请求可以来自任何来源,因此我需要打开这些端点以允许来自任何来源的 CORS 请求。

我尝试了以下方法:

@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

CorsConfiguration apiCorsConfig = new CorsConfiguration();
apiCorsConfig.addAllowedOrigin("https://example.com");
apiCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
apiCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
apiCorsConfig.setMaxAge(600L);
source.registerCorsConfiguration("/**", apiCorsConfig);

CorsConfiguration samlCorsConfig = new CorsConfiguration();
samlCorsConfig.addAllowedOrigin(CorsConfiguration.ALL);
samlCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
samlCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
samlCorsConfig.setMaxAge(600L);
source.registerCorsConfiguration("/saml/**", samlCorsConfig);

FilterRegistrationBean filterRegistrationBean =
new FilterRegistrationBean<>(new CorsFilter(source));
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}

但是,这不起作用,并且当未知来源尝试访问 /saml/** 端点时,会返回 403 Invalid CORS request


我猜这里的问题是更通用的 /** 模式优先,即使存在更具体的 ant-pattern /saml/** 匹配请求。

我不想显式配置所有其他端点以允许网站来源,但希望它能够捕获与任何其他 CORS 配置不匹配的请求。


如何允许任何来源访问 /saml/**,同时仍然只允许 https://example.com 访问所有其他 enpoint /**?

最佳答案

通过将 CorsConfiguration 添加到 UrlBasedCorsConfigurationSource 内的 LinkedHashMap 来注册它们。这意味着顺序被保留,只需按正确的顺序添加 CorsConfiguration 即可:

@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

CorsConfiguration samlCorsConfig = new CorsConfiguration();
samlCorsConfig.addAllowedOrigin(CorsConfiguration.ALL);
samlCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
samlCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
samlCorsConfig.setMaxAge(600L);
source.registerCorsConfiguration("/saml/**", samlCorsConfig);

CorsConfiguration apiCorsConfig = new CorsConfiguration();
apiCorsConfig.addAllowedOrigin("https://example.com");
apiCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
apiCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
apiCorsConfig.setMaxAge(600L);
source.registerCorsConfiguration("/**", apiCorsConfig);

FilterRegistrationBean filterRegistrationBean =
new FilterRegistrationBean<>(new CorsFilter(source));
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}

关于java - 如何为不同的 URL 堆叠 CORS 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com