Spring Cloud Gateway 和 TokenRelay 过滤器

Posted

技术标签:

【中文标题】Spring Cloud Gateway 和 TokenRelay 过滤器【英文标题】:Spring Cloud Gateway and TokenRelay Filter 【发布时间】:2020-05-31 18:15:09 【问题描述】:

我正在尝试将 JHipster 从使用 Zuul 迁移到 Spring Cloud Gateway。 JHipster 使用 Eureka 来查找路由,我相信我已经正确配置了 Spring Cloud Gateway 来查找路由并将访问令牌传播给它们。这是我的配置:

spring:
  cloud:
    gateway:
      default-filters:
        - TokenRelay
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
          route-id-prefix: /services/
      httpclient:
        pool:
          max-connections: 1000

我遇到的问题是访问令牌没有向下游服务发送 Authorization 标头。

这是在我的application.yml 中使用 Zuul 进行配置的方式:

zuul: # those values must be configured depending on the application specific needs
  sensitive-headers: Cookie,Set-Cookie #see https://github.com/spring-cloud/spring-cloud-netflix/issues/3126
  host:
    max-total-connections: 1000
    max-per-route-connections: 100
  prefix: /services
  semaphore:
    max-semaphores: 500

我创建了一个拉取请求来显示集成 Spring Cloud Gateway 后发生的变化。

https://github.com/mraible/jhipster-reactive-microservices-oauth2/pull/4

重现问题的步骤:

git clone -b reactive git@github.com:mraible/jhipster-reactive-microservices-oauth2.git

启动 JHipster Registry、Keycloak 和网关应用程序:

cd jhipster-reactive-microservices-oauth2/gateway
docker-compose -f src/main/docker/jhipster-registry.yml up -d
docker-compose -f src/main/docker/keycloak.yml up -d
./mvnw

启动 MongoDB 和博客应用程序:

cd ../blog
docker-compose -f src/main/docker/mongodb.yml up -d
./mvnw

在浏览器中导航到http://localhost:8080,使用admin/admin 登录,然后尝试转到实体 > 博客。您将收到 403 拒绝访问错误。如果您在 Chrome 开发者工具中查看网络流量,您会发现访问令牌未包含在任何标头中。

【问题讨论】:

我可以使用this answer 解决这个问题。我还必须将.pathMatchers("/services/**").authenticated() 添加到我的安全配置中,这对于 Zuul 来说是不需要的。你可以看到我的commit here。 【参考方案1】:

我可以使用this answer 解决这个问题。

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          predicates:
            - name: Path
              args:
                pattern: "'/services/'+serviceId.toLowerCase()+'/**'"
          filters:
            - name: RewritePath
              args:
                regexp: "'/services/' + serviceId.toLowerCase() + '/(?<remaining>.*)'"
                replacement: "'/$remaining'"

我还必须将.pathMatchers("/services/**").authenticated() 添加到我的安全配置中,这对于 Zuul 来说是不需要的。你可以看到我的commit here。

【讨论】:

以上是关于Spring Cloud Gateway 和 TokenRelay 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Gateway:retry 与 fallback

最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)

Spring Cloud(18)——gateway

浅谈Spring Cloud Gateway技术

聊聊spring cloud gateway的NettyConfiguration

Spring Cloud Gateway初体验