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
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
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">--> <!--<!–Restrict URLs based on role–>--> <!--<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" />--> <!--<!– requires-channel="https"/> –>--> <!--<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">--> <!--<!–<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> –>--> <!--</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>
Partager