Подтвердить что ты не робот

Spring Сервер авторизации OAuth за Spring Cloud Zuul Proxy

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

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

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

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

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

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

Какой был бы лучший способ настроить это?

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

Ответ 1

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


Пробовали ли вы zuul настройку (на сервере 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.

Сервер Auth должен быть включен

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

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


Спасибо @thomas-letch, вы должны настроить вашу безопасность следующим образом (образец)

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); 
} 

Ответ 2

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

Это означает, что (образец конфигурации из Dave Syer 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.routes.*

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

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