Spring Cloud Gateway и фильтр TokenRelay - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь перенести 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 в последующие службы.

Вот как все было настроено с Zuul в моем application.yml:

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, 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 и попробуйте go до Entities > Блог . Вы получите сообщение об ошибке «Отказано в доступе 403». Если вы посмотрите в Chrome Developer Tools на сетевой трафик c, вы увидите, что токен доступа не включен ни в какие заголовки.

1 Ответ

1 голос
/ 19 февраля 2020

Я смог решить эту проблему, используя этот ответ .

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. Вы можете увидеть мой коммит здесь .

...