2015-06-28 13 views
11

Sto provando a utilizzare ZuulFilter in un semplice gateway cloud Spring-Cloud-Netflix Api (proxy inverso) per autenticare le richieste contro un provider di autenticazione personalizzato (tramite Rest call).NetflixOSS Zuul Filter per rifiutare le richieste

Il filtro deve rifiutare richieste non autorizzate con un 401 e non inoltrare tali richieste più in basso ai servizi proxy.

E 'possibile anche per un filtro Zuul? Non ho trovato documentazione, esempio o qualcosa in Zuuls api.

Qualche suggerimento?

risposta

19

Ho ottenuto questo lavoro, ho scavato un po '. Assicurati che la tua richiesta non sia già stata memorizzata nella cache. Basta chiamare questo metodo dal metodo run() all'interno di ZuulFilter.

/** 
* Reports an error message given a response body and code. 
* 
* @param body 
* @param code 
*/ 
private void setFailedRequest(String body, int code) { 
    log.debug("Reporting error ({}): {}", code, body); 
    RequestContext ctx = RequestContext.getCurrentContext(); 
    ctx.setResponseStatusCode(code); 
    if (ctx.getResponseBody() == null) { 
     ctx.setResponseBody(body); 
     ctx.setSendZuulResponse(false); 
    } 
} 
+1

Questo funziona - un semplice "ctx.setSendZuulResponse (false);" mancava nel nostro codice :) –

+0

@ thomas-jäckle, Supponendo che chiami l'auth-service da un pre-filtro, come si ottiene il corpo? Qual è il codice? –

+0

Il corpo della risposta sarà vuoto perché non ha ancora effettuato una chiamata (pre-filtro). In realtà puoi semplicemente impostare ctx.setSendZuulResponse (false); per realizzare ciò che è necessario probabile. – azdragon2

1

Se si desidera utilizzare l'autenticazione con Spring Cloud, provare il progetto Spring Security Cloud.

+0

Sì, questo progetto ha qualche utile strumenti per l'utilizzo di oauth. Zuul è fondamentalmente una lavagna vuota. Spring Cloud Netflix Zuul ha alcune semplici funzionalità di routing e inoltro. I filtri Zuul ti consentono di accedere alla richiesta e alla risposta http non elaborate, così puoi fare tutto ciò che ti serve. Vedere la mia risposta a questa domanda per iniziare: http://stackoverflow.com/questions/31055736/creating-custom-zuul-filters – spencergibb

1

Io uso un filtro pre per controllare l'autenticazione della richiesta, e se la richiesta dose non autorizzato, allora io tornare 401 e non chiamare il servizio di back-end più. Lo faccio in run() funzione come questa:

RequestContext ctx = getCurrentContext(); 
// do something to check the authentication 
if(auth failed){ 
    ctx.unset(); 
    ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 
} 

ctx.unset() dicono contesto di fermare questa richiesta, e ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); impostare il codice HTTP per 401

anche vedere Netflix Zuul - block request routing

+0

facendo ctx.unset() fa fare a Zuul un'eccezione. Solo ctx.setSendZuulResponse (false); per me va bene. – icordoba