为什么带网关的spring-cloud忽略了www.example.com中定义的cors属性application.properties?

1yjd4xko  于 2022-11-28  发布在  Spring
关注(0)|答案(1)|浏览(130)

我正在尝试使用spring-cloud和spring-gateway构建一个微服务spring-boot应用程序。在我的应用程序中,有一个api-gateway应用程序处理所有的请求,然后将这些请求分派到正确的微服务。
对于前端,我使用angular,对于测试端点,我使用postman。目前,我遇到了CORS问题。我以如下方式配置了api网关:

spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping=true
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedOrigins=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedHeaders=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowedMethods=*

根据文档,它应该足以允许客户端毫无问题地提出请求。
我还以这种方式配置了所有网关路由...

spring.cloud.gateway.routes[8].id=entity-service
spring.cloud.gateway.routes[8].uri=lb://entity-service
spring.cloud.gateway.routes[8].predicates[0]=Path=/api/entity/hello

我的安全配置也如下所示

@Configuration
    @EnableWebFluxSecurity
    public class SecurityConfig {
    
            @Bean
            public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity serverHttpSecurity) {
                serverHttpSecurity
                        .authorizeExchange(exchange ->
                                exchange.pathMatchers("/eureka/**")
                                        .permitAll()
                                        .anyExchange()
                                        .authenticated())
                        .cors()
                        .and()
                        .csrf()
                        .disable()
                        .oauth2ResourceServer(ServerHttpSecurity.OAuth2ResourceServerSpec::jwt);
                return serverHttpSecurity.build();
            }
        }

例如,如果我用postman向路径/api/entity/hello发出请求,我会得到正确的响应。如果我使用Angular 客户端并尝试访问一个端点,首先会发出OPTIONS预检请求并返回:

  • 跨源请求被阻止:同源策略不允许阅读位于http://localhost:8080/api/entity/hello的远程资源。(原因:CORS标题“访问控制-允许-来源”缺失)。状态代码:第401条 *

则发出对..../hello路径的GET请求,结果是相同的。
我使用的是spring-boot 2.7.3和最新的spring-boot-cloud和网关包。
你有什么办法解决这个问题吗?任何帮助都将不胜感激。感谢所有人

sr4lhrrt

sr4lhrrt1#

尝试将CorsConfigurationSource Bean添加到配置类。

@Bean
public CorsConfigurationSource corsConfigurationSource(GlobalCorsProperties globalCorsProperties) {
    var source = new UrlBasedCorsConfigurationSource();
    globalCorsProperties.getCorsConfigurations().forEach(source::registerCorsConfiguration);
    return source;
}

相关问题