2015-05-19 9 views
22

Obecnie rozwijam aplikację opartą na architekturze mikro-usługi. Używamy bramy API zaimplementowanej za pomocą serwera Zuul Spring Cloud Netfix do kierowania żądań do naszych mikro serwisów.Wiosenny serwer autoryzacji OAuth za Spring Cloud Zuul Proxy

Aby zrealizować pojedyncze logowanie dla wszystkich naszych usług, aktualnie pracuję nad serwerem OAuth2 skonfigurowanym przy użyciu Spring Cloud Security. Serwer jest w zasadzie tylko kopią i przeszłością implementacji w Repe Dave Syer: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

Główna różnica polega na tym, że chcę przekierować żądania do mojego serwera OAuth za pośrednictwem serwera proxy Zuul. W ten sposób nie będę musiał bezpośrednio ujawniać mojego serwera OAuth i mogę dynamicznie dodawać i usuwać serwer logowania.

Problem polega na tym, że nie próbuję zrozumieć, jak poprawnie skonfigurować tę konfigurację. Kiedy próbuję uzyskać dostęp do chronionego zasobu na serwerze OAuth, jestem przekierowywany na stronę logowania. To oczywiście jest zgodne z oczekiwaniami. Ale nie wiem, jak ustawić nazwę hosta i port używany podczas przesyłania dalej. To, co chcę zrobić, to serwer do przekazania do punktu końcowego na serwerze Zuul, który zostanie przesłany z powrotem do serwera OAuth. (Zuul API-Gateway powinien być jedynym serwerem, z którym klient kiedykolwiek rozmawia. Cała reszta będzie ukryta.)

Ponieważ jest to host i port są odczytywane z HttpServletRequest w LoginUrlAuthenticationEntryPoint. Ale żądanie, które widzi serwer, to żądanie wysłane przez serwer proxy Zuul. Tak więc jestem przekazywany do wewnętrznego adresu IP, a nie punktu końcowego na serwerze proxy.

Próbowałem ustawić adres URL strony logowania w WebSecurityConfigurerAdapter.configure(HttpSecurity) na adres URL bezwzględny mojego serwera proxy Zuul. Ale to właśnie spowodowało, że moja aplikacja skarżyła się na zbyt wiele przekierowań. (Może spowodowało to pętlę.)

Jaki byłby najlepszy sposób, aby to ustawić?

  • Czy muszę wdrażać jakąś własną strategię przekazywania poprzez zastąpienie fasoli?
  • Czy istnieje opcja konfiguracji, której mi brakuje?
  • Czy mój pomysł się myli? (W jego odpowiedź na How to avoid redirect to another host with Zuul? Dave Syer mówi, że normalnie nie proxy to jednak nie wyjaśnia, dlaczego.)
+0

Więc w końcu jak postępować z tym problemem? – wmfairuz

+0

Czy możesz dodać, jak to rozwiązałeś i zaimplementowałeś? – Sourabh

+0

Zaakceptowałem na razie najwyższą odpowiedź. –

Odpowiedz

13

Aktualizacja: POC można znaleźć tutaj https://github.com/kakawait/uaa-behind-zuul-sample


Czy spróbować następujących ustawień (na serwerze 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 
     ... 

zasadzie to działa na moim projekcie jedyną rzeczą jaką muszę zrób to, aby wyłączyć ochronę CSRF na trasie /uaa/oauth/token.

serwer

Auth powinien być na

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

badano stosując Spring-Cloud.Brixton.M3


Dzięki @thomas-letsch, należy dostosować Ci bezpieczeństwo jak następujący (przykład)

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

To działa również dla mnie. Musiałem wykluczyć ścieżkę/uaa/oauth z zabezpieczeń. Zobaczyć tę część z mojego WebSecurityConfigurerAdapter: –

+0

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

+0

W moim osobistym przypadku przepisuję 'OAuth2ClientContextFilter' na obsługę' URI' (i nie tylko 'URL'), dzięki czemu mogę używać' accessTokenUri:/uaa/oauth/token'. I dla 'userAuthorizationUri' używam' localhost' jak po 'userAuthorizationUri: http: // localhost/uaa/oauth/authorize'. Tak więc konfiguracja jest przenośna (nie muszę wiedzieć, gdzie znajduje się UAA). Otworzyłem problem dla tego https://github.com/spring-projects/spring-security-oauth/issues/671 – Kakawait

2

O ile dobrze rozumiem pytanie, spring-cloud-security (dla EnableOauth2Sso części) i spring-cloud (dla Zuul) nie jest to możliwe, aby serwer proxy wywoływał połączenia do serwera autoryzacji za pomocą programu zuul. Głównym powodem jest to, że spring-cloud-security zabezpiecza Bramę niezależnie (i przed rozliczeniem) z logiką Zuul.

co oznacza, że ​​(przykładowa konfiguracja z OAuth2 przykład Dave Syer za) spring.oauth2.client.* konfiguracja

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

jest uważany przed umożliwienie dostępu do strefy Zuul na trasach zuul.routes.*

Ponadto ta konfiguracja umożliwia klientowi agent do przechowywania dwóch plików cookie: jednego dla bramy i jednego dla serwera autoryzacji.

Mam nadzieję, że to pomoże.

Powiązane problemy