2013-06-06 5 views
9

Ho un tipico MVC Spring in esecuzione su Tomcat. Dopo aver acceso il sistema per l'esecuzione su HTTPS (tutto funziona correttamente con HTTP semplice), il login ha smesso di funzionare. Il motivo è che l'oggetto SecurityContextHolder.getContext().getAuthentication() di Spring diventa null dopo l'utilizzo di RedirectView.SpringContextHolder.getContext(). GetAuthentication() restituisce null dopo che RedirectView è utilizzato in HTTPS/SSL

Ho già cercato la risposta, l'unico che ho trovato suggerito di impostare la proprietà redirectHttp10Compatible su false nell'impostazione del bean viewResolver. Questo non ha aiutato.

Ho anche controllato che durante il reindirizzamento, il mio ID di sessione rimane lo stesso e la connessione rimane sicura, cioè non è un problema (almeno per quanto ho potuto dire) di un cambio tra http e https o viceversa.

Quale potrebbe essere il problema?

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 


    <http auto-config="true"> 
    <intercept-url pattern="/**" requires-channel="https" /> 

    <intercept-url pattern="/index*" access="ROLE_USER"/> 


    <intercept-url pattern="/dashboard*" access="ROLE_USER" requires-channel="https"/> 

    <intercept-url pattern="/login*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/> 
    <intercept-url pattern="/signin*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/> 
    <intercept-url pattern="/signup*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>  


    <form-login login-page="/home" 
       default-target-url="/home" 
       authentication-failure-url="/home?authentication_error=true" 
       authentication-success-handler-ref="redefineTargetURL" 
    /> 


    <anonymous username="guest" granted-authority="ROLE_GUEST" key="anonymousKey"/> 
    <logout invalidate-session="true" logout-success-url="/logout?message=Logout Successful" /> 

    </http> 



<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="userDetailsService" /> 
</authentication-manager> 


<beans:bean id="redefineTargetURL" class="com.groupskeed.common.RedefineTargetURL" /> 
<beans:bean id="userDetailsService" class="com.groupskeed.security.UserDetailsServiceImpl" /> 

+0

Hai provato accedendo tramite il sessione? Inoltre, si prega di postare la configurazione per aiutare ulteriormente il debug. Vorrei esaminare l'allegato dell'autenticazione tra Session e SecurityContext. – Carsten

+0

Grazie per la risposta. Quali file di configurazione dovrei pubblicare? –

+0

La configurazione di sicurezza Spring. E se si usano implementazioni di classi personalizzate, anche queste potrebbero essere utili. – Carsten

risposta

25

Il SecurityContextHolder.getContext().getAuthentication() diventare nullo dopo reindirizzamento è corretto dal momento che è threadbound. Ma dovrebbe essere ripopolato dalla sessione. Pertanto, provare a tenere traccia dell'attributo SPRING_SECURITY_CONTEXT nella sessione. Ecco qualche esempio di codice per avere un'idea:

HttpSession session = request.getSession(true); 
System.out.println(session.getAttribute("SPRING_SECURITY_CONTEXT")); 

Nella documentazione Primavera di sicurezza v'è una parte su come HTTPS/HTTP di commutazione può rovinare la sessione forse c'è un accenno al problema da qualche parte in là. http://static.springsource.org/spring-security/site/faq.html#d0e223

Le domande frequenti sopra riportate consentono di esaminare come viene gestita la sessione nell'applicazione. Probabilmente inizierei a considerare l'implementazione di AuthenticationSuccessHandler. (Si può psot nella tua domanda, se volete.)

Per ulteriori dettagli su come il contesto di sicurezza è gestita in applicazioni web vedere la seguente: (paragrafo 5.4): http://static.springsource.org/spring-security/site/docs/3.0.x/reference/technical-overview.html

+0

Grazie mille! Quindi (sto comprendendo correttamente?) - stai dicendo che dovrei impostare l'oggetto SecurityContext nella sessione come un attributo e quindi estrarlo da lì dopo i reindirizzamenti invece di estrarlo da SecurityContextHolder? –

+0

Solitamente Spring Security dovrebbe farlo da solo. a seconda di quali parti di essa sono state implementate, la funzionalità potrebbe essere interrotta.Cerca di scoprire che cosa sta succedendo con securitycontext in modalità debug e trova il momento in cui il comportamento deriva da quanto indicato nella documentazione. Per collegare questo processo: Se si sta compilando il securityContext, probabilmente è necessario allegarlo alla sessione. – Carsten

+0

Questo davvero aiutato! Purtroppo non posso votare la tua risposta, richiede "reputazione" che non ho :( –

Problemi correlati