2015-05-19 21 views
22

Attualmente sto sviluppando un'applicazione basata su un'architettura di micro servizi. Utilizziamo un gateway API implementato utilizzando il server Zuul di Spring Cloud Netfix per instradare le richieste ai nostri micro servizi.Spring OAuth Authorization Server dietro Spring Cloud Zuul Proxy

Per realizzare un unico accesso per tutti i nostri servizi Attualmente sto lavorando a un server OAuth2 configurato utilizzando Spring Cloud Security. Il server è fondamentalmente solo copia e passato dell'implementazione in Repos di Dave Syer: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

La differenza principale è che voglio instradare le richieste al mio server OAuth tramite Zuul Proxy. In questo modo non dovrò esporre direttamente il mio server OAuth e aggiungere e rimuovere il server di login in modo dinamico.

Il problema è che non ho cucito per capire come configurare correttamente questa configurazione. Quando provo ad accedere a una risorsa protetta sul server OAuth, sono inoltrato alla pagina di accesso. Questo naturalmente è come previsto. Ma non riesco a capire come impostare il nome host e la porta utilizzata durante l'inoltro. Quello che voglio che succeda è che il server deve inoltrare a un endpoint sul server Zuul che sarà rexiedato al server OAuth. (Il gateway API Zuul dovrebbe essere l'unico server con cui il cliente parla. Tutto il resto sarà nascosto.)

Come è l'host e la porta vengono letti da HttpServletRequest in LoginUrlAuthenticationEntryPoint. Ma la richiesta che il server vede è la richiesta inviata dal proxy Zuul. Quindi sono inoltrato a un IP interno non a un endpoint sul proxy.

Ho provato a impostare l'URL della pagina di accesso in WebSecurityConfigurerAdapter.configure(HttpSecurity) nell'URL absolut del mio Zuul Proxy. Ma questo ha solo causato alla mia applicazione di lamentarsi di troppi reindirizzamenti. (Potrebbe aver causato un loop lì.)

Quale sarebbe il modo migliore per impostare questo?

  • Devo implementare una sorta di propria strategia di inoltro sovrascrivendo un bean?
  • C'è un'opzione di configurazione che mi manca?
  • La mia idea è sbagliata? (Nella sua risposta alla How to avoid redirect to another host with Zuul? Dave Syer dice che normalmente non procura questo, ma non spiega perché.)
+0

Così alla fine come procedi con questo problema? – wmfairuz

+0

Potresti aggiungere come hai risolto questo problema e implementato? – Sourabh

+0

Per ora ho accettato la risposta più alta. –

risposta

13

Aggiornamento: POC può essere trovato qui https://github.com/kakawait/uaa-behind-zuul-sample


hai provato dopo l'installazione (sul zuul server):

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 
     ... 

In pratica funziona sul mio progetto unica cosa che devo fare è disabilitare la protezione CSRF sulla rotta /uaa/oauth/token.

server di

Auth dovrebbe essere sulla

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

testati utilizzando Spring-Cloud.Brixton.M3


Grazie a @thomas-letsch, si dovrebbe ottimizzare si sicurezza come seguire (campione)

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

Questo funziona anche per me. Ho dovuto escludere il percorso/uaa/oauth dalla sicurezza. Vedere questa parte dal mio WebSecurityConfigurerAdapter: –

+0

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

+0

Nel mio caso riscrivo 'OAuth2ClientContextFilter' per supportare' URI' (e non solo 'URL'), quindi posso usare' accessTokenUri:/uaa/oauth/token'. E per 'userAuthorizationUri' utilizzo' localhost' come seguendo 'userAuthorizationUri: http: // localhost/uaa/oauth/authorize'. Quindi la configurazione è portatile (non ho bisogno di sapere dove si trova UAA). Ho aperto un problema per questo https://github.com/spring-projects/spring-security-oauth/issues/671 – Kakawait

2

Per quanto ho capito la tua domanda, spring-cloud-security (per la EnableOauth2Sso parte) e spring-cloud (per Zuul), questo non è possibile per proxy le chiamate al server di autorizzazione usando zuul. Il motivo principale è che il spring-cloud-security protegge il gateway in modo indipendente (e prima di rendere conto) della logica di routing di Zuul.

che significa che il (configurazione di esempio da OAuth2 esempio di Dave Syer) spring.oauth2.client.* configurazione

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

è considerato prima consentire qualsiasi collegamenti del Zuul zuul.routes.*

Inoltre questa configurazione consente al client agente per memorizzare due cookie: uno per il gateway e uno per il server di autorizzazione.

Spero che questo aiuti.