首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring云网关+ Keycloak CORS不工作

Spring云网关+ Keycloak CORS不工作
EN

Stack Overflow用户
提问于 2022-05-02 13:12:12
回答 1查看 477关注 0票数 -1

我使用Spring开发了后端微服务应用程序,并将API网关放在微服务的前面。为了对用户进行身份验证,我使用Keycloak。现在我正在使用Svelte开发前端应用程序,我在网关应用程序中配置了我的application.yml,如下所示:

代码语言:javascript
复制
spring:
  cloud:
    gateway:
      default-filters:
        - TokenRelay
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"
            allowedHeaders: "*"
        add-to-simple-url-handler-mapping: true

但是,当我试图发送AJAX请求时,我会得到CORS错误。

此外,我还具有spring安全性(通过org.springframework.boot:spring-boot-starter-oauth2-clientorg.springframework.boot:spring-boot-starter-oauth2-resource-server依赖项)。我将SecurityWebFilterChain定义为:

代码语言:javascript
复制
@Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
                .cors().and()
                .authorizeExchange()
                .pathMatchers("/actuator/**")
                .permitAll()
                .and()
                .authorizeExchange()
                .anyExchange()
                .authenticated()
                .and()
                .oauth2Login(); // to redirect to oauth2 login page.

        return http.build();
    }

当将前端构建放在静态文件夹中时,没有CORS错误,但是对于开发,我需要本地主机上不同端口的开发人员node.js服务器。

那么,如何解决这个cors问题呢?

EN

回答 1

Stack Overflow用户

发布于 2022-05-02 16:15:50

您可以创建一个类来定义这样的Cors映射:

代码语言:javascript
复制
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

上面的示例支持从任何源到应用程序中任何端点的CORS请求。

为了更好地锁定这一点,registry.addMapping方法返回一个CorsRegistration对象,我们可以使用该对象进行额外的配置。还有一个allowedOrigins方法,它允许我们指定一个允许的起源数组。如果我们需要在运行时从外部源加载这个数组,这可能很有用。

此外,还有allowedMethods、allowedHeaders、exposedHeaders、maxAge和allowCredentials,我们可以使用它们来设置响应头和自定义选项。

具有Spring安全性的CORS:

如果在您的项目中使用Security,您必须采取额外的步骤,以确保它与CORS很好地合作。这是因为CORS需要先被处理。否则,Security将在请求到达Spring之前拒绝它。

幸运的是,Security提供了一个开箱即用的解决方案:

代码语言:javascript
复制
@EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.cors().and()...
        }
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72087244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档