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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !