2014-10-23 26 views
7

Abbiamo un'applicazione build su Java 1.6 con Spring 3.0.3 che utilizza Spring Security 3.0.5 e implementa API REST utilizzando Spring Web con RestEasy 2.1.0. Ho bisogno di posizionare questa applicazione (server) dietro un proxy che traduca il traffico di richieste HTTPS da un'applicazione client API REST nel traffico HTTP. Questa modifica crea uno scenario "cross domain" per la richiesta di accesso: il client invia la richiesta HTTPS per l'accesso e Server risponde con l'URL di reindirizzamento di HTTP. Attualmente risposte con:Come eseguire l'applicazione Spring Security per l'esecuzione dietro un proxy?

”http://192.168.0.10:8090/index.html;jsessionid=64FD79...86D”,

quello che mi serve è:

”/index.html;jsessionid=64FD79...86D”

Siamo venuti con la soluzione per rendere server per rispondere con la “relativa” URL invece “ assoluto "URL. Così ho cercato di implementare qualcosa di simile con situazione descritta qui:

thread on forum.spring.io

ho impostato il fagiolo RedirectStrategy con contextRelative = "true" e sovrascrivere il setter redirectStrategy da AbstractAuthenticationTargetUrlRequestHandler nel mio LoginSuccessHandler esteso di classe e vedo la proprietà redirectStrategy per l'oggetto HttpServletResponse è impostata su true come previsto. Ancora non risolve il problema.

anche quando si cambia proprietà redirectURLCC di HttpServletResponse oggetto utilizzando encodeRedirectURL ("otherLogin") è qualcosa come set

”http://192.168.0.10:8090/otherLogin”

e non è quello che mi serve. Devo rimuovere l'intero protocollo + parte dell'indirizzo IP dell'URL. La proprietà URL dell'oggetto risposta non è accessibile per le modifiche poiché viene implementata dall'implementazione delle interfacce Filter e FilterChain.

Si prega di suggerire qualsiasi idea. Suppongo che questo tipo di cose dovrebbero essere risolti nei file web.xml o auth-AplicationContext.xml non nel codice.

I migliori saluti.

risposta

4

Primavera di sicurezza utilizza la seguente logica quando si invia un reindirizzamento:

public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException { 
    String redirectUrl = calculateRedirectUrl(request.getContextPath(), url); 
    redirectUrl = response.encodeRedirectURL(redirectUrl); 

    if (logger.isDebugEnabled()) { 
     logger.debug("Redirecting to '" + redirectUrl + "'"); 
    } 

    response.sendRedirect(redirectUrl); 
} 

Il metodo sendRedirect è tenuto a comportarsi nel modo seguente:

Questo metodo può accettare URL relativi; il contenitore servlet deve convertire l'URL relativo in un URL assoluto prima di inviare la risposta al client.

Ciò significa che sarà sempre possibile ottenere un URL assoluto, indipendentemente dalla configurazione o dalle impostazioni del contesto.

si dispone di più opzioni:

  • Configurazione contenitore o application server di essere a conoscenza l'URL pubblico (ad esempio utilizzando AJP al posto di HTTP proxy inverso, o passando intestazioni HTTP con l'URL pubblico che è supportato da alcuni server applicativi), ad es documentation for Tomcat
  • configurare il proxy inverso HTTP per eseguire la riscrittura corretta, ad es. vedi ProxyPassReverse in Apache mod_proxy documentation
  • implementare una consuetudine org.springframework.security.web.RedirectStrategy dove potrete impostare manualmente l'intestazione Location risposta e HTTP 302 codice di stato, questo dovrebbe consentire di inviare contesto relativo reindirizzamento come si desidera
1

Non del tutto relativa, ma probabilmente potresti voler dare un'occhiata a una quarta opzione usando lo org.springframework.web.servlet.view.UrlBasedViewResolver per riscrivere l'URL reindirizzato con il tuo nome host esterno come descritto in questa risposta: Override the default redirect URL in a SpringMVC application.

1

Questo dovrebbe essere realizzabile su Apache con:

ProxyPreserveHost Off 
ProxyPass/http://192.168.0.10:8090 
ProxyPassReverse/http://192.168.0.10:8090 

e aggiungendo un proxy inverso sull'host proxing con la porta. per esempio supponendo il nome del server è proxy.example.com la quarta linea sarebbe:

ProxyPassReverse/http://proxy.exemple.com:8090 

Guardate questa risposta: Sending redirect in Tomcat web application behind a Apache 2 proxy (mod_proxy)

Problemi correlati