IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Web Java Discussion :

[Spring Security] Gestion des sessions concurrentes


Sujet :

Spring Web Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 101
    Points : 57
    Points
    57
    Par défaut [Spring Security] Gestion des sessions concurrentes


    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 !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 51
    Points : 30
    Points
    30
    Par défaut
    Salut Shuret,

    Je cherche à faire la même chose que toi mais je n'ai pas réussi

    Peux-tu STp quand tu aura résolu ton problème m'envoyer un petit exemple d'appli qui permet de gérer ca ? il y a tellement de conf et de paramétrages à faire que je suis complètement perdu

    Merci bcp par avance

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 101
    Points : 57
    Points
    57
    Par défaut
    Finalement il y a une solution, mais faut reconnaitre que la gestion des sessions concurrentes n'est pas gérée de façon simple dans Spring Security.

    Contrairement à ce que j'ai indiqué dans mon premier post, le fonctionnement était correct :
    - avec exception-if-maximum-exceeded="false", en cas de connexion avec le même login, la première session était invalidée et la seconde marchait.
    - si =true, je ne pouvais pas me connecter la seconde fois mais la redirection se faisait vers login.html?login_error=1, ce qui finalement est logique puisqu'une exception authentication était bien levée.

    En fait, exception-if-maximum-exceeded="true" est incompatible avec expired-url.

    - si false : la seconde connexion invalide la première
    - si true : la seconde connexion lève une exception, la première reste valide

    Voici donc une configuration qui marche, en ne permettant pas à l'utilisateur de se connecter s'il l'est déjà ailleurs :

    security.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <security:concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" />
    <security:form-login login-page="/login.html" login-processing-url="/j_spring_security_check" default-target-url="/home.html" />
    La gestion des exceptions levées au moment du login se fait dans le contrôleur :

    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
    Exception loginException;
     
    // Récupération de l'exception Spring Security
    loginException = (Exception) session.getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
     
    if (loginException != null) {
     
    	if (loginException instanceof BadCredentialsException) {
    		log.warn("Nom d'utilisateur ou mot de passe incorrect");
    		model.addAttribute("loginError", "authentication.error.badcredentials");
    	}
     
    	if (loginException instanceof ConcurrentLoginException) {
    		log.warn("Session déjà ouverte");
    		model.addAttribute("loginError", "authentication.error.duplicatesession");
    	}
    }
    Il y a encore d'autres exception, à tester. En tout cas, ça fonctionne enfin comme je voulais !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des session Spring Hibernate
    Par aminedeveloppement dans le forum Hibernate
    Réponses: 0
    Dernier message: 20/04/2013, 23h58
  2. [Security] Gestion des sessions dans Spring Security
    Par flamant dans le forum Spring
    Réponses: 1
    Dernier message: 31/07/2012, 10h08
  3. [Spring & Hibernate] Gestion des sessions Hibernate
    Par Fennec. dans le forum Hibernate
    Réponses: 5
    Dernier message: 26/08/2010, 16h42
  4. Hibernate/Spring : gestion des sessions
    Par herve91 dans le forum Hibernate
    Réponses: 5
    Dernier message: 13/05/2010, 11h15
  5. [tomcat] gestion des sessions
    Par sebos63 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/10/2004, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo