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 :
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
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>
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 <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>
D'autre part, à quoi sert sessionRegistry, pour info ?
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"; }
Merci de votre aide !
Partager