Gestion de la Session de Printemps de Sécurité

Je suis nouveau sur le Printemps de Sécurité. J'ai une obligation de faire une URL en fonction de l'authentification dans laquelle un utilisateur doit être authentifié basé sur une référence unique qui sera envoyé à chaque fois qu'un paramètre dans l'URL. Je vais passer sur cette référence à un service web, obtenir les données requises, puis authentifier l'utilisateur (et de définir les rôles). L'Authentification & l'Autorisation de la partie qui est fonctionne bien.

Cependant, lorsque j'essaie d'accéder à l'application à nouveau (avec une référence différente de l'URL), il est dit "SecurityContextHolder pas remplie avec des anonymes jeton, comme elle l'a déjà contenues ..." et il l'a montré les détails de la demande précédente. J'ai essayé de compensation le contexte de sécurité en utilisant
SecurityContextHolder.getContext().setAuthentication(null) et SecurityContextHolder.clearContext().

Après cela, j'ai été en mesure d'accéder à l'application plusieurs fois. Cependant, si j'essaie d'accéder à l'application simultanée à partir de mes collègues de la machine, j'obtiens une page blanche. Lors de la vérification des logs, je vois un message "SecurityContextHolder pas remplie avec des anonymes jeton ...". J'ai aussi essayé de configurer les sessions mais je suis désemparés quant à où je veux en perdre la piste.

Ci-dessous est mon web.xml (seulement le printemps de sécurité partie):

<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.web.context.ContextLoaderListener
    </listener-class>
</listener>

<listener>
    <listener-class>
          org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

<session-config>
<session-timeout>30</session-timeout>
</session-config>

spring-security.xml:

<http use-expressions="true" auto-config="false" entry-point-                   
ref="http403ForbiddenEntryPoint">
<intercept-url pattern="/paymentPortalInternal.*" access="hasRole('Internal')"/>
<intercept-url pattern="/paymentPortalExternal.*" access="hasRole('External')"/>
<custom-filter position="PRE_AUTH_FILTER" ref="customAuthenticationFilter"/>
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<session-management session-authentication-strategy-ref="sas"/>
</http>
<beans:bean id="concurrencyFilter"
class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>
<beans:bean id="http403ForbiddenEntryPoint"
class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<beans:bean id="customAuthenticationFilter"
class="com.xxx.xxx.xxxxx.security.CustomAuthenticationFilter">
<beans:property name="sessionAuthenticationStrategy" ref="sas" />
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<beans:bean id="sas" 
class="org.springframework.security.web.authentication.session.
ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="maximumSessions" value="1" />
<beans:property name="exceptionIfMaximumExceeded" value="true" />
</beans:bean>
<beans:bean id="sessionRegistry"    
class="org.springframework.security.core.session.SessionRegistryImpl" />
<authentication-manager alias="authenticationManager">
<authentication-provider ref="preauthAuthProvider" />
</authentication-manager>
<beans:bean id="preauthAuthProvider" 
class="org.springframework.security.web.authentication.preauth.
PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
<beans:bean class="com.XXX.XXXX.XXX.UserServiceImpl" />
</beans:property>
</beans:bean>

S'il vous plaît laissez-moi savoir si j'ai besoin de fournir plus d'informations.

EDIT: Ajout de Journaux.

Pour la première Demande:

2013-02-07 17:27:38,834 de DÉBOGAGE [http-8081-2][org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(127)] - Pas de HttpSession existe actuellement
2013-02-07 17:27:38,834 de DÉBOGAGE [http-8081-2][org.springframework.security.web.context.HttpSessionSecurityContextRepository.loadContext(85)] - Pas de SecurityContext était disponible à partir du HttpSession: null. Un nouveau sera créé.

Pour la deuxième demande(Veuillez noter que les détails dans le contexte de sécurité sont celles de la première demande):

2013-02-07 17:27:54,272 de DÉBOGAGE [http-8081-2][org.springframework.security.web.context.HttpSessionSecurityContextRepository.readSecurityContextFromSession(158)] - a Obtenu un valide SecurityContext de SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@1017293c: Authentification: org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@1017293c: Directeur: org.springframework.security.core.userdetails.User@35cd3811: nom d'utilisateur: Interne@5581e6e1-7e61-41bb-9257-b3c1acb96519; Mot de passe: [PROTÉGÉS]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Accordé Autorités: Interne; les informations d'Identification: [PROTÉGÉS]; Authentifié: true; Détails: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffc434: Adresse_ip_distante: 10.188.182.107; SessionId: null; Accordé Autorités: Interne'

Ma compréhension est que le contexte de sécurité titulaire stocke les détails de tous les utilisateurs. Mais dans ce cas, je ne suis pas en mesure de lancer l'application à partir d'un autre onglet/navigateur.

Il semble que votre authentification personnalisée filtre est ignorant le changement dans le paramètre de l'URL, peut-être parce que l'utilisateur est déjà authentifié. Aussi, vous devriez probablement supprimer toutes les séances simultanées choses jusqu'à ce que vous pouvez obtenir, il bases de travail correctement.
Merci pour votre réponse Luke. Le problème ici est que, quand la deuxième demande est tiré, mon customAuthenticationFilter n'est pas déclenché. Veuillez voir le journal de trace j'ai ajouté à la question.
Juste pour ajouter un point de plus ici.. Nous n'avons pas un bon mécanisme de connexion est en place. Tout ce que nous avons est une référence unique qui vient de l'URL. Donc, idéalement lors d'une deuxième demande, il est aussi bon en tant que nouvel utilisateur d'essayer d'obtenir authentifié. Cependant, le contexte de sécurité est déjà rempli avec le jeton de l'utilisateur premier et je suis paumé en ce moment. Je vais maintenant essayer le SecurityContextPersistenceFilter filtre. Je vais dans la bonne direction?
Si vous vous connectez dans la même session, alors il n'est pas surprenant que le contexte de sécurité contient déjà le précédent de l'authentification. Vous devriez vraiment post le contour de votre CustomAuthenticationFilter. Vous dites qu'il n'est pas "déclenché". Avez-vous de débogage pour savoir pourquoi? C'est un filtre, d'où son doFilter méthode est appelée à chaque demande. Placer un point d'arrêt. Et vous n'avez pas précisé pourquoi vous utilisez toutes les séances simultanées de l'infrastructure. Aussi, en passant des paramètres d'authentification dans une URL est généralement mal vu pour des raisons de sécurité.
J'ai trouvé la raison de mon customAuthFilter n'est pas déclenché pour la deuxième demande. Il semble que la position que je suis en invoquant qu'il est mauvais. J'ai utilisé la position="PRE_AUTH_FILTER" plus tôt. J'ai essayé avec d'autres positions (comme d'ABORD, BASIC_AUTH_FILTER, etc) et le filtre est capable d'authentifier les demandes multiples. Cependant, l'anonyme filtre est se déclenche après mon customAuthFilter et il est primordial que le contexte de sécurité avec un anonyme, un jeton. Est-il un moyen pour éviter cela? Je vais maintenant essayer d'utiliser le filterProxyChain d'utiliser uniquement les filtres nécessaires.

OriginalL'auteur Mahesh Kumar | 2013-02-07