Сервер авторизации Spring OAuth за прокси-сервером Spring Cloud Zuul

В настоящее время я занимаюсь разработкой приложения на основе микросервисной архитектуры. Мы используем API-шлюз, реализованный с использованием Zuul Server Spring Cloud Netfix, для маршрутизации запросов к нашим микро-сервисам.

Для реализации единого входа для всех наших служб в настоящее время я работаю на сервере OAuth2, настроенном с использованием Spring Cloud Security. Сервер в основном просто копия и прошлая реализация в репо Дейва Сайера: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

Основное отличие состоит в том, что я хочу направлять запросы на мой сервер OAuth через прокси Zuul. Таким образом, мне не придется напрямую выставлять мой OAuth-сервер, и я могу динамически добавлять и удалять Login Server.

Проблема в том, что я не шва, чтобы понять, как правильно настроить эту настройку. Когда я пытаюсь получить доступ к защищенному ресурсу на сервере OAuth, меня перенаправляют на страницу входа. Это, конечно, как и ожидалось. Но я не могу понять, как установить имя хоста и порт, используемый при пересылке. Я хочу, чтобы сервер переадресовал конечную точку на сервере Zuul, которая будет перенаправлена ​​обратно на сервер OAuth. (API-шлюз Zuul должен быть единственным сервером, с которым когда-либо общался клиент. Все остальное будет скрыто.)

Так как это хост и порт читаются из HttpServletRequest в LoginUrlAuthenticationEntryPoint, Но запрос, который видит сервер, является запросом, отправленным прокси Zuul. Поэтому я перенаправлен на внутренний IP, а не на конечную точку прокси.

Я пытался установить URL-адрес страницы входа в WebSecurityConfigurerAdapter.configure(HttpSecurity) на абсолютный URL моего Zuul Proxy. Но из-за этого мое приложение жаловалось на слишком много перенаправлений. (Возможно, там возникла петля.)

Как лучше всего это настроить?

  • Должен ли я реализовать какую-то собственную стратегию пересылки, переопределив бин?
  • Есть ли опция конфигурации, которую мне не хватает?
  • Моя идея сама по себе неверна? (В своем ответе на вопрос " Как избежать перенаправления на другой хост с Zuul? Дейв Сайер говорит, что вы обычно не будете использовать прокси-сервер, но не объясняет почему.)

2 ответа

Решение

Обновление: POC можно найти здесь https://github.com/kakawait/uaa-behind-zuul-sample


Вы пробовали следующие настройки (на zuul сервер):

zuul:
  routes:
    uaa-service:
      path: /uaa/**
      stripPrefix: false

security:
  # Disable Spring Boot basic authentication
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      accessTokenUri: https://<zuul hostname>/uaa/oauth/token
      userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
      ...

В основном это работает на моем проекте, единственное, что мне нужно сделать, это отключить CSRF защита на /uaa/oauth/token маршрут.

Сервер аутентификации должен быть включен

server:
  # Use different context-path to avoid session cookie overlapping
  context-path: /uaa

Протестировано с использованием Spring-Cloud.Brixton.M3


Спасибо Thomas Letsch, вам нужно настроить безопасность следующим образом (пример)

public void configure(HttpSecurity http) throws Exception { 
    http.logout().and()
        .antMatcher("/**").authorizeRequests() 
        .antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll() 
        .anyRequest().authenticated().and() 
        .csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/‌​oauth/token").and() 
        .addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class); 
} 

Насколько я понимаю твой вопрос, spring-cloud-security (для EnableOauth2Sso часть) и spring-cloud (для zuul), это не возможно для прокси-вызовов на сервер авторизации с помощью zuul. Основная причина в том, что spring-cloud-security защищает шлюз независимо (и до учета) логики маршрутизации Zuul.

Это означает, что (пример конфигурации из примера Дэйва Сайера OAuth2) spring.oauth2.client.* конфигурация

spring:
  oauth2:
    client:
      accessTokenUri: http://localhost:9999/uaa/oauth/token
      userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
      clientId: acme
      clientSecret: acmesecret

считается, прежде чем разрешить любой доступ к маршрутам Zuul zuul.routes.*

Кроме того, эта настройка позволяет клиентскому агенту хранить два файла cookie: один для шлюза и один для сервера авторизации.

Надеюсь, это поможет.

Другие вопросы по тегам