Как подключить весенний oauth с помощью весенней эврики?

Я создал одностраничное приложение, используя Spring Tutorial для его создания с AngularJS и OAuth, и его можно найти здесь: https://spring.io/guides/tutorials/spring-security-and-angular-js/#_multiple_ui_applications_and_a_gateway_single_page_application_with_spring_and_angular_js>_part_vi

Это файлы application.yml для приложения SPA:

security:
  user:
    password: none
  oauth2:
    client:
      accessTokenUri: localhost:7777/uaa/oauth/token
      userAuthorizationUri: localhost:7777/uaa/oauth/authorize
      clientId: acme
      clientSecret: acmesecret
    resource:
      user-info-uri: localhost:7777/uaa/user


zuul:
  routes:
    resource:
      path: /resource/**
      url: localhost:9000/resource
    user:
      path: /user/**
      url: localhost:7777/uaa/user

eureka:
  client:
    serviceUrl:
      defaultZone: ${vcap.services.eureka-service.credentials.uri:127.0.0.1:8761}/eureka/

---
spring:
  profiles: cloud
eureka:
  instance:
    hostname: ${APPLICATION_DOMAIN}
    nonSecurePort: 80

Я хочу знать, как бы я изменил маршруты zuul и user-info-uri, чтобы мне не нужно было указывать URL-адреса, и все это можно было бы сделать с помощью идентификатора службы. Я посмотрел учебник по использованию eureka здесь:

https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka

но я не совсем понимаю, как я могу достичь своей цели, не добавляя всю java в свой код, потому что базовый сервер eureka, похоже, уже регистрирует все мои службы.


person Ian Neethling    schedule 26.01.2016    source источник


Ответы (2)


Если я правильно понимаю ваш вопрос, вы можете просто использовать файл конфигурации по этому шаблону:

zuul:
  routes:
    <service_id>:
      path: /path/**

Например (если ваш oauth-сервис зарегистрирован как auth):

zuul:
  routes:
    auth:
      path: /user/**

Zuul будет использовать Eureka и находить конечные точки для сервисов. В дополнение к этому он обеспечит балансировку нагрузки на стороне клиента.

person Benny    schedule 26.01.2016
comment
Это будет работать для конечных точек zuul, но свойства oauth2.* по-прежнему должны указывать на физический URL-адрес. - person Dave Syer; 26.01.2016
comment
Нужны ли вам свойства oauth2 в шлюзе Zuul-API? - person Benny; 26.01.2016
comment
Если ему нужно пройти аутентификацию через OAuth2, очевидно. Иначе никак, вообще говоря. - person Dave Syer; 26.01.2016
comment
Да вообще-то. Я имею в виду, что если вы получите токен от любого провайдера (например, ваш собственный сервер OAuth2 за Zuul), вы будете использовать его для аутентификации в бэкэнд-сервисах. Таким образом, вам не нужно будет выполнять аутентификацию в Zuul. Я что-то упустил здесь? - person Benny; 27.01.2016
comment
Я так не думаю. Архитектура (топология) является гибкой. Я считаю полезным размещать аутентификацию на границе (например, Zuul), но я уверен, что вы можете создавать системы, которые этого не делают. - person Dave Syer; 27.01.2016

Была проблема с использованием идентификатора службы eureka, userInfoUri все время выдавал исключение UnknownHost Exception, @LoadBallanced restTemplate не решил мою проблему, решение заключалось в том, чтобы установить для Preference-token-info значение false (если true - балансировка нагрузки для oauth не выполняется)

security.oauth2.resource.service-id={Service ID as at eureka server registered}
security.oauth2.resource.userInfoUri= http://${security.oauth2.resource.service-id}/user/me
security.oauth2.resource.loadBalanced=true
security.oauth2.resource.prefer-token-info=false

номер порта не требуется, если используется идентификатор службы, но требуется, если используется IP или хост

person Anton Syzko    schedule 12.02.2018