2011-12-20 4 views
2

J'ai passé beaucoup de temps à résoudre ce problème, mais je n'arrivais toujours pas à le faire fonctionner. J'utilise Spring Security. L'application fonctionnera sur plusieurs serveurs. J'utilise l'option "se souvenir de moi" lors de la connexion pour enregistrer les connexions persistantes dans ma base de données.Comment Invalider les sessions des utilisateurs lors de la déconnexion?

Si un utilisateur est connecté au serveur 1, il dispose d'un identifiant de session dans le navigateur de cookies. J'ouvre un autre serveur et cet utilisateur fait l'authentification et le navigateur de biscuits ont cet id de session et l'identification de session de la connexion du serveur 1. Lorsque cet utilisateur se déconnecte d'un serveur ou d'un autre serveur, il doit être redirigé vers la page de connexion de tous les serveurs.

J'ai essayé d'enlever les cookies du navigateur sans succès. Comment puis-je faire ce travail? De l'aide? Exemple de scénario: Dans gmail, si vous avez 2 onglets ouverts dans votre compte et que vous vous déconnectez de l'un d'entre eux, un autre onglet se déconnecte automatiquement. Le serveur 1 ne connaît pas les informations du serveur 2 .. Je pense que mon problème est ici mais je ne sais pas comment je peux résoudre ce problème.

C'est ma config de sécurité:

<http auto-config="false" use-expressions="true" disable-url-rewriting="true"> 
    <intercept-url pattern="/login.do" access="permitAll" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
    <remember-me data-source-ref="dataSource" /> 
    <form-login login-page="/login.do" /> 
    <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" /> 
    <custom-filter position="LOGOUT_FILTER" ref="logoutFilter" /> 
    <session-management session-authentication-strategy-ref="sas" /> 
</http> 

<!-- <logout logout-url="/j_spring_security_logout" logout-success-url="/" invalidate-session="true" /> --> 

<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter"> 
    <beans:constructor-arg value="/login.do" /> 
    <beans:constructor-arg> 
     <beans:list> 
     <beans:ref bean="rememberMeServices"/> 
     <beans:ref bean="logoutHandler"/> 
     </beans:list> 
    </beans:constructor-arg> 
    <!-- <beans:property name="filterProcessesUrl" value="/login.do" /> --> 
</beans:bean> 

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" /> 

<beans:bean id="concurrencyFilter" class="org.springframework.security.web.session.ConcurrentSessionFilter"> 
    <beans:property name="sessionRegistry" ref="sessionRegistry" /> 
    <beans:property name="expiredUrl" value="/login.do" /> 
</beans:bean> 

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy"> 
    <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 
    <beans:property name="maximumSessions" value="1" /> 
</beans:bean> 

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

Répondre

1

Je vous recommande de jeter un oeil à SessionRegistry .Vous pouvez vérifier here. Il y a eu une discussion à ce sujet au Is it possible to invalidate a spring security session?. Vérifiez également cela

Les sessions de printemps sont stockées en tant que cookies JsessionID. Vérifiez here pour une discussion sur l'enlèvement des cookies.

La même requête a été discutée au Invalid a session when user makes logout (Spring).

+0

SessionRegistry ne fonctionne que sur un serveur. – sourcedelica

+1

En fait, toute cette réponse est une réponse à un seul serveur. – sourcedelica

5

Voici 3 solutions pour votre scénario à plusieurs serveurs:

  1. Utilisez des séances collantes sur votre équilibreur de charge afin que l'utilisateur revient sans cesse sur le même serveur. Ensuite, vous venez d'invalider la session lorsqu'ils se déconnectent. Ceci est généralement couplé avec une solution de basculement de session (Tomcat example), donc si un serveur tombe en panne, un utilisateur peut être redirigé vers un nouveau serveur qui récupère son ancienne session.

  2. Utilisez un cache distribué pour les sessions (par exemple Terracotta Web Sessions). Puis, quand ils déconnectent annuler la session et sera invalidée partout.

  3. Une autre solution consiste à utiliser un TokenBasedRememberMeServices Spring Security personnalisé en tant que votre « login » cookie Si l'utilisateur ne sélectionne pas se souvenir de moi, allez-y et paramétrez le cookie, mais faites-en un cookie de session de navigateur au lieu d'un cookie persistant.Tous les serveurs reconnaîtront l'utilisateur et créeront une session pour celui-ci. supprimer le cookie Vous aurez également besoin d'un RememberMeAuthenticationFilter personnalisé qui recherche un jeton d'authentification dans la session et un cookie RememberMe manquant, invalidant la session et effaçant le contenu de sécurité. xt si c'est le cas.

Questions connexes