[Spring Security] Gestion des sessions concurrentes
:salut:
Dans mon appli web je veux n'autoriser qu'une seule session par utilisateur et indiquer un message du genre "une session est déjà ouverte pour l'utilisateur machin, veuillez mettre fin à cette session avant de vous reconnecter" si un utilisateur essaie de se connecter alors qu'il a déjà une session ouverte sous son login.
J'ai trouvé ce topic http://forum.springframework.org/showthread.php?t=61187 et essayé ce qu'ils proposent mais sans succès.
Si je mets exception-if-maximum-exceeded="false", je peux me connecter 2 fois avec le même utilisateur. Si je le mets à true, je suis redirigé vers la page d'erreur de login par défaut (login.html?login_error=1) et non celle configurée (login.html?session_error=1). Comment faire fonctionner cette gestion des sessions concurrentes ?
Voici mon code :
applicationSecurityContext.xml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.2.xsd">
<security:global-method-security secured-annotations="enabled" />
<security:http auto-config="true">
<security:intercept-url pattern="/login.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/logout-success.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER, ROLE_ADMIN" />
<security:form-login login-page="/login.html" login-processing-url="/j_spring_security_check" default-target-url="/home.html" authentication-failure-url="/login.html?login_error=1" />
<security:logout invalidate-session="true" logout-url="/logout.html" logout-success-url="/logout-success.html" />
<security:concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="false" expired-url="/login.html?session_error=1" session-registry-alias="sessionRegistry"/>
</security:http>
<security:authentication-provider user-service-ref="userDetailsService" />
</beans> |
Partie sécurité du web.xml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener> |
Le contrôleur qui gère login.html :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
@RequestMapping("/login.html")
public String displayLoginPage(HttpServletRequest request, ModelMap model) {
String error;
// Affichage de l'erreur en cas de mauvais utilisateur/mot de passe
error = (String) request.getParameter("login_error");
if (!(error==null || error.equals(""))) {
log.warn("Nom d'utilisateur ou mot de passe incorrect");
model.addAttribute("loginError", "Nom d'utilisateur ou mot de passe incorrect");
}
// Affichage de l'erreur en cas de session déjà ouverte
error = (String) request.getParameter("session_error");
if (!(error==null || error.equals(""))) {
log.warn("Session déjà ouverte");
model.addAttribute("sessionError", "Session déjà ouverte");
}
return "login";
} |
D'autre part, à quoi sert sessionRegistry, pour info ?
Merci de votre aide !