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 Java Discussion :

Gestion des sessions dans Spring Security


Sujet :

Spring Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Points : 250
    Points
    250
    Par défaut Gestion des sessions dans Spring Security
    Bonjour,
    j'utilise Spring security
    Au départ J'ai eu le problème suivant: quand un utilisateur se connecte à mon application (coté serveur) les Dao se connectent à un schéma de base de donnée qui est sélectionné dans la première combobox de ma page d'acceuil.

    Un problem critique est apparu quand le même utilisateur se connecte 2 fois sur le même browser sur 2 tab différentes et sur chaque tab se connecte sur 2 schéma de BDD différents. Une chose que je n'arrive pas à expliquer est que les 2 connections partagent la même session. Donc si l'utilisateur sur la première tab TAB1 sélectionne sur un schéma SCHEMA1 puis va sur le second tab TAB2 sélectionne un second schema SCHEMA2 (à ce moment en fait le schéma sélectionné pour les 2 connection est SCHEMA2), puis retourne sur le tab TAB1 et éxécute une action, il pense travailler sur le SCEMA1 alors qu'en fait il travaille sur le schema SCHEMA2

    Y a t-il un moyen de dire à Spring de créer à chaque fois une nouvelle session même si c'est le même utilisateur qui se connecte sur 2 tab différentes du même browser sur la même application (le même serveur) avec la même autentification (userName/password)

    Comme les 2 connections sur 2 tab différentes, j'ai pensé à générer un nombre aléatoire pendant le premier accès à la page d'acceuil, mettre ce nombre en session, et vérifier qu'à chaque accès à cette page d'acceuil (j'ai un controlleur index qui est appelé après l'autentification pour renvoyer la page d'acceuil) ce nombre est null (au départ (premier accès) bien sur il est null) de manière que si l'utilisateur se connecte sur le même browser depuis le même ordinateur, je bloque l'accès (redirection vers une page d'erreur)
    Sur la page d'erreur, je propose d'ouvrir une nouvelle fenêtre avec la page d'autentification. Mais le problème est que j'ai de nouveau la même session sur cette nouvelle connection.

    Comment m'en sortir alors ?

    J'ai aussi quelques question d'ordre générale nsur les sessions. Est-ce que la session est créée par le browser ou par le serveur ? Je suppose que dès que l'utilisateur s'autentifie, une session est créé par le browser. Mais il semble que l'identifiant de la session soit généré par le serveur, en particulier par Spring Security. Donc quelle est la différence entre session et sessionId ? Est-ce que c'est possible que la session soit créée par le browser et que le serveur lui donne un identifiant qui dépend de la stratégie Spring Security appliqué ?

    Et est-ce que le browser qui enregistre le sessionId dans un cookie est capable de gérer une différence entre 2 connections différentes sur le même serveur par le même utilisateur sur 2 tab différentes ou 2 window du même browser


    je vous donne un extrait de mon fichier xml de Spring Security

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
     
    <beans:beans xmlns="http://www.springframework.org/schema/security"
                 xmlns:p="http://www.springframework.org/schema/p"
                 xmlns:beans="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/security
            http://www.springframework.org/schema/security/spring-security-3.0.xsd">
     
        <!-- annotation based security -->
        <!-- JSR-250 annotation based security -->
        <!-- Spring Security native annotation based security -->
        <global-method-security secured-annotations="enabled"
                                jsr250-annotations="enabled"
                                pre-post-annotations="enabled">
            <!-- Security Pointcut to all Services methods -->
            <protect-pointcut expression="execution(* com.*.*Service.*(..))" access="ROLE_RDE"/>
        </global-method-security>
     
        <beans:bean id="authenticationSuccessHandler" class="com.security.AuthenticationSuccessHandlerImpl"
                    p:defaultTargetUrl="/secure/index.htm">
            <beans:property name="userManagementService" ref="userManagementService"/>
            <beans:property name="accountManagementService" ref="accountManagementService"/>
        </beans:bean>
        <beans:bean id="authenticationFailureHandler" class="com.security.AuthenticationFailureHandlerImpl"
                    p:defaultFailureUrl="/login.htm">
            <beans:property name="userManagementService" ref="userManagementService"/>
        </beans:bean>
     
        <beans:bean id="authenticationSuccessHandlerReconnect" class="com.security.AuthenticationSuccessReconnectionHandlerImpl">
            <beans:property name="userManagementService" ref="userManagementService"/>
            <beans:property name="accountManagementService" ref="accountManagementService"/>
        </beans:bean>
        <beans:bean id="authenticationFailureHandlerReconnect" class="com.security.AuthenticationFailureReconnectionHandlerImpl">
            <beans:property name="userManagementService" ref="userManagementService"/>
        </beans:bean>
     
        <beans:bean id="authenticationProvider"
                    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
            <beans:property name="passwordEncoder" ref="passwordEncoder"/>
            <beans:property name="saltSource" ref="saltSource"/>
            <beans:property name="userDetailsService" ref="userManagementService"/>
        </beans:bean>
     
        <authentication-manager alias="authenticationManager">
            <authentication-provider ref="authenticationProvider">
                <password-encoder ref="passwordEncoder"/>
            </authentication-provider>
        </authentication-manager>
     
        <beans:bean id="authenticationFilter" class="com.security.UserNamePasswordTokenAuthenticationFilter">
            <beans:property name="authenticationManager" ref="authenticationManager"/>
            <beans:property name="filterProcessesUrl" value="/j_spring_security_check"/>
            <beans:property name="authenticationSuccessHandler" ref="authenticationSuccessHandler"/>
            <beans:property name="authenticationFailureHandler" ref="authenticationFailureHandler"/>
            <beans:property name="userManagementService" ref="userManagementService"/>
        </beans:bean>
     
        <beans:bean id="authenticationEntryPoint"
                    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
            <beans:property name="loginFormUrl" value="/login.htm"/>
        </beans:bean>
     
        <beans:bean class="com.security.SecurityContextLogoutHandler"
                    name="logoutHandler">
        </beans:bean>
     
        <http entry-point-ref="authenticationEntryPoint" disable-url-rewriting="true">
            <!--Restrict URLs based on role-->
            <intercept-url pattern="/css/**" filters="none" requires-channel="https"/>
            <intercept-url pattern="/js/**" filters="none" requires-channel="https"/>
            <intercept-url pattern="/ext/**" filters="none" requires-channel="https"/>
            <intercept-url pattern="/img/**" filters="none" requires-channel="https"/>
            <intercept-url pattern="/userguide/**" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
            <intercept-url pattern="/login.htm*" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
            <!--  requires-channel="https"/> -->
            <intercept-url pattern="/login.jsp*" access="ROLE_RDE" requires-channel="https"/>
            <intercept-url pattern="/user/**" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
            <intercept-url pattern="/secure/**" access="ROLE_RDE" requires-channel="https"/>
            <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/>
            <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter"/>
            <session-management invalid-session-url="/reconnection.htm">
                <!--<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> -->
            </session-management>
            <logout logout-success-url="/login.htm"/>
        </http>
     
        <!--<http entry-point-ref="authenticationEntryPoint" disable-url-rewriting="true">-->
            <!--&lt;!&ndash;Restrict URLs based on role&ndash;&gt;-->
            <!--<intercept-url pattern="/css/**" filters="none" />-->
            <!--<intercept-url pattern="/js/**" filters="none" />-->
            <!--<intercept-url pattern="/ext/**" filters="none" />-->
            <!--<intercept-url pattern="/img/**" filters="none" />-->
            <!--<intercept-url pattern="/userguide/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />-->
            <!--<intercept-url pattern="/login.htm*" access="IS_AUTHENTICATED_ANONYMOUSLY" />-->
            <!--&lt;!&ndash;  requires-channel="https"/> &ndash;&gt;-->
            <!--<intercept-url pattern="/login.jsp*" access="ROLE_RDE" />-->
            <!--<intercept-url pattern="/user/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />-->
            <!--<intercept-url pattern="/secure/**" access="ROLE_RDE" />-->
            <!--<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />-->
            <!--<custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter"/>-->
            <!--<session-management invalid-session-url="/login.htm">-->
                <!--&lt;!&ndash;<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> &ndash;&gt;-->
            <!--</session-management>-->
            <!--<logout logout-success-url="/login.htm"/>-->
        <!--</http>-->
     
        <!-- PasswordChecker Configuration -->
        <beans:bean id="passwordChecker" class="com.security.password.impl.PasswordCheckerImpl">
            <beans:property name="minLength" value="${security.passwordPolicy.minLength}"/>
            <beans:property name="maxLength" value="${security.passwordPolicy.maxLength}"/>
            <beans:property name="minDiffChars" value="${security.passwordPolicy.minDiffChars}"/>
            <beans:property name="needUpperAndLowerCase" value="${security.passwordPolicy.needUpperAndLowerCase}"/>
            <beans:property name="needNumbers" value="${security.passwordPolicy.needNumbers}"/>
            <beans:property name="needChars" value="${security.passwordPolicy.needChars}"/>
            <beans:property name="needSpecialCharacters" value="${security.passwordPolicy.needSpecialCharacters}"/>
            <beans:property name="dictionaryCheck" value="${security.passwordPolicy.dictionaryCheck}"/>
            <beans:property name="dictionaryWords" value="${security.passwordPolicy.dictionaryWords}"/>
        </beans:bean>
     
        <beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
            <beans:constructor-arg value="256"/>
        </beans:bean>
        <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.SystemWideSaltSource">
            <beans:property name="systemWideSalt" value="${security.saltSource}"/>
        </beans:bean>
     
    </beans:beans>
    Toute réponse, idées, lien internet sur des sites intéressants, explications ou idéalement solution serait vraiment appréciés car c'est une demande urgente de notre client

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Une ou plusieurs fenêtre(s) d'un navigateur partage les mêmes sessions pour toutes les tab donc tu ne peux pas les gérer avec Spring.
    Quelques solutions:
    1- passer de variable URL.
    2- utiliser 2 types de navigateurs (FF et Chrome par exemple).

    A+.

Discussions similaires

  1. Gestion des sessions dans EXJS4
    Par senobogos dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 18/06/2012, 17h35
  2. [Data] Gestion de session dans Spring
    Par swoop314 dans le forum Spring
    Réponses: 1
    Dernier message: 19/03/2012, 22h58
  3. [Security] gestion expiration session avec Spring security
    Par devparadize dans le forum Spring
    Réponses: 1
    Dernier message: 20/09/2010, 12h40
  4. gestion des session dans Tomcat 6.0 (aide+conseil)
    Par norten dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 12/05/2009, 17h11
  5. [Spring Security] Gestion des sessions concurrentes
    Par Shuret dans le forum Spring Web
    Réponses: 2
    Dernier message: 09/02/2009, 17h59

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