2012-04-30 7 views
31

Possiedo un'app Web Spring, protetta con Spring Security, in esecuzione su EC2. Di fronte all'istanza EC2 c'è un Elastic Load Balancer con un certificato SSL (https termina con il load balancer cioè porta 443 -> porta 80), quindi dal punto di vista di Tomcat, le richieste in entrata sono HTTP.Accesso HTTPS con reindirizzamenti Spring Security a HTTP

Il mio modulo di accesso è inoltrato a https, tuttavia il successivo reindirizzamento va a http (successo o errore). L'autenticazione ha avuto successo, e posso tornare a https e ho effettuato l'accesso

La mia configurazione login assomiglia così:.

<security:form-login 
    default-target-url="/home" 
    login-page="/" 
    login-processing-url="/processlogin" 
    authentication-failure-url="/?login_error=1"/> 

Di cosa ho bisogno di cambiare per rendere default-bersaglio-url e authentication-failure-url vai a https?

  • Tomcat 6 3.0.x
  • Primavera di sicurezza
+0

Ho impostato una riscrittura di Apache nel frattempo, ma sono curioso di sapere se c'è un modo per farlo con la configurazione di Spring Security. – Thody

+0

in genere viene eseguito con il bilanciamento del carico e la configurazione è denominata url-rewrite. In questo modo il bilanciamento del carico si assicura che il reindirizzamento rimanga su https. – Ritesh

risposta

1

Un modo ho ottenuto questo lavoro è aggiungendo la seguente configurazione

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" > 
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" /> 
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" /> 
    ... 
</http> 

dovuto aggiungere always-use-default-target="true" e default-target-url="https://....". Non è il modo ideale in quanto è necessario codificare l'URL nella configurazione.

0

I set richiede-channel = "any" su tutti gli intercept-urls. Questo gli permette di funzionare ancora nel mio ambiente dev dove non uso SSL.

<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/> 
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> 
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/> 

Poi, creare un host virtuale apache che reindirizza tutto il traffico alla versione HTTPS.

<VirtualHost *:80> 
    ServerName www.mywebsite.com 
    Redirect permanent/https://www.mywebsite.com/ 
</VirtualHost> 
+5

Dopo l'accesso, Spring invierà comunque un'intestazione Location con un indirizzo http. L'utente non se ne accorgerà, perché il tuo apache lo reindirizzerà immediatamente su https, ma è ancora un serio problema di sicurezza, perché il browser invierà i cookie di sessione su un canale non sicuro. – marcelj

+0

@marcelj: l'ho appena eseguito tramite firebug e tu hai ragione. Cercherò di capire una soluzione migliore e rivedere la mia risposta se lo faccio. –

+0

@marcelj, potresti spiegare perché questo è un serio rischio per la sicurezza o fornire un riferimento che descrive il rischio? –

19

La configurazione della molla deve essere agonostica rispetto al protocollo utilizzato. Se usi qualcosa come "require-channel", prima o poi ti imbatterai in problemi, specialmente se vuoi distribuire la stessa applicazione in un ambiente di sviluppo senza https.

Invece, considerare di configurare il tomcat correttamente. Puoi farlo con RemoteIpValve. A seconda di quale intestazioni loadbalancer invia, la configurazione server.xml deve contenere qualcosa di simile:

<Valve 
    className="org.apache.catalina.valves.RemoteIpValve" 
    internalProxies=".*" 
    protocolHeader="X-Forwarded-Proto" 
    httpsServerPort="443" 
    /> 

Primavera determinerà l'indirizzo reindirizzamento assoluto sulla base del ServletRequest, in modo da cambiare il httpsServerPort se si utilizza qualcosa di diverso 443:

il httpsServerPort è la porta restituito da ServletRequest.getServerPort() quando il protocolHeader indica https protocollo

0

Anche io sto affrontando esattamente lo stesso problema e finché non avrò la soluzione giusta sto reindirizzando le mie richieste dal server proxy al server Tomcat su AJP invece di HTTP. Qui di seguito è la mia configurazione di Apache

ProxyPass /myproject ajp://localhost:8009/myproject 
ProxyPassReverse /myproject ajp://localhost:8009/myproject 
0

utilizzo sotto le righe di codice in web.xml

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Login and Restricted Space URLs</web-resource-name> 
    <url-pattern>/j_security_check</url-pattern> 
    <url-pattern>/loginpage.rose</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

rende obbligatorio l'utilizzo di HTTPS.