2011-06-09 4 views
0

J'utilise Spring Security 3.0 avec Spring MVC. Mon application Web Java est un panier. J'utilise un service qui stocke une liste de courses en session, lorsque l'utilisateur A crée une liste de courses, puis se déconnecte et se reconnecte, la liste de courses est restaurée normalement, mais si un autre utilisateur B va à la même application, en utilisant le même navigateur et en vous connectant, la session est restaurée en utilisant la liste d'achats de l'utilisateur A !. Ce que je peux comprendre, c'est que le cookie JSESSION ne change pas lorsque l'utilisateur se déconnecte du même navigateur. C'est la raison pour laquelle si l'utilisateur A se connecte à l'application en utilisant un autre navigateur, il n'a pas les mêmes données de session, le cookie JSESSION est différent. J'utilise mon propre gestionnaire de succès d'authentification pour me connecter et me déconnecter.Comment créer un nouveau cookie pour un nouvel utilisateur connecté inSpring Security

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/index.html" access="permitAll"/> 
    <form-login login-page="/index.html" 
       default-target-url="/index.html" 
       authentication-success-handler-ref = "loginSuccessHandler" 
       /> 

    <logout invalidate-session="false" logout-url="/logout" success-handler-ref="logoutSuccessHandler" /> 
    <!-- <logout invalidate-session="false" success-handler-ref="logoutSuccessHandler" /> --> 
</http> 

Et oui à l'aide d'invalider session = « true » pourrait être une solution de courte durée, mais de cette façon, je ne peux pas utiliser les données enregistrées en session. Ce que je veux, c'est que lorsque UserA se connecte à un navigateur, enregistre des données dans une session (la liste d'achats), puis déconnecte, que UserB ait sa propre session, au lieu d'utiliser la session UserA, je suspecte que La réponse consiste à assigner un nouveau cookie à userB, mais aussi à asigner l'ancien cookie à UserA.

+0

Si le panier est dans la session et que la session n'est pas invalidée lorsque l'utilisateur se déconnecte, le panier est toujours actif dans ce navigateur, non? Je suppose qu'ils n'y ont tout simplement pas accès parce que toutes les pages du panier exigent que vous soyez connecté? – sourcedelica

+0

Oui, les pages du panier exigent que vous soyez connecté.Quand je logote, les JSESSION ne changent pas, donc n'importe quel utilisateur qui se connecte obtient la même session que l'utilisateur précédent – Jeeba

Répondre

1

Le plus proche sera un élément <session-managemement>.

  • Si vous définissez l'attribut session-fixation-protection réglé sur "migrateSession", le nouveau jeton aura la session des attributs de l'ancien jeton.

  • Si vous le définissez sur "newSession", les attributs de session seront ignorés.

Référez-vous au SpringSecurity manual pour plus de détails.


Ce que je veux est que lorsque UserA se connecter dans un navigateur, enregistrer des données à la session (la liste d'achats), puis vous déloguer, faire UtilisateurB ont sa propre session, au lieu d'utiliser la session de UserA , je soupçonne que la réponse est en asigning un nouveau cookie à userB, mais aussi, pour asigner l'ancien cookie à UserA.

Je ne pense pas que vous y parviendrez simplement en changeant le jeton de session. Le problème est que le navigateur ne stocke qu'un jeton de session. Une fois que le jeton a été modifié, le navigateur n'a aucune connaissance de l'ancienne valeur de jeton et le serveur ne sait pas qui possède l'ancien jeton. Si vous voulez que la liste d'achats persiste au-delà de la fin de la session (c'est-à-dire après la déconnexion de l'utilisateur), vous devrez la conserver ailleurs.

+0

Je pense que vous voulez dire 'newSession' - Créez une nouvelle session" propre ", sans copier les données de session existantes, pas' migrateSession '(parce que sinon le nouvel utilisateur récupère le panier de l'ancien utilisateur). Mais alors il n'y a aucun moyen de récupérer l'ancienne session. – sourcedelica

+0

Je pense que vous avez raison, les données de la session doivent être conservées ailleurs. – Jeeba

0

Vous devez stocker le panier dans la base de données, et non dans la session. Vous aurez également besoin d'un travail cron qui purge les chariots viciés afin qu'ils ne remplissent pas la DB.

+0

Cela peut être une solution indirecte, mais j'espère qu'il pourrait y avoir quelque chose de plus lié à Spring Security, ou peut-être en utilisant deux cookies, un par navigateur et un par utilisateur. Je vais attendre plus de temps pour voir d'autres réponses merci. – Jeeba

Questions connexes