SpringSecurity: ne parviennent pas à supprimer JSESSIONID
J'ai besoin de supprimer le cookie JSESSIONID lorsque l'utilisateur se déconnecte. Pour ce faire, j'ai ajouté la configuration suivante pour la sécurité de mon config:
<http>
<form-login login-page="/login*" authentication-failure-url="/login?try_again" />
<http-basic />
<logout logout-url="/logout" delete-cookies="JSESSIONID" />
<session-management invalid-session-url="/timeout" />
<intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
...
</http>
Mais au lieu d'être supprimé, le cookie est juste devenu dupliqué:
De sorte qu'il conserve rediriger le navigateur de l' "/timeout" de l'URL.
J'ai essayé de tracer ce qui se passe en utilisant les Outils de développement de Chrome, le navigateur web, et j'ai trouvé que ce cookie met en place avec cet en-tête de réponse:
Set-Cookie:JSESSIONID=CFF85EA743724F23FDA0317A75CFAD44; Path=/website/; HttpOnly
Et supprime avec cet en-tête de réponse:
Set-Cookie:JSESSIONID=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/website
Je ne suis pas sûr, mais il me semble que la raison en est dans le "Chemin" de ces en-têtes: dans la première, il souligne "/site web/", et dans la seconde, il souligne "site web".
Est-ce la raison de l'ennui? Si ce n'est pas la raison (ou pas seulement), ce qui est l'autre raison(s)? Comment dois-je résoudre ce problème?
- Voir static.springsource.org/spring-security/site/docs/3.2.x/... (Section 3.3.3) ...Malheureusement cela ne peut pas être garanti à travailler avec chaque conteneur de servlet, de sorte que vous aurez besoin de le tester dans votre environnement. Voir aussi note de bas de page associée.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin explicitement supprimer la
JSESSIONID
cookie comme ça. Il n'est pas géré par Spring Security en tant que tel, mais par votre conteneur de servlet. Printemps de Sécurité par défaut d'invalider la session http lors de la déconnexion, qui provoque à son tour votre conteneur de servlet pour supprimer leJSESSIONID
cookie.Dans mon cas, pour une raison quelconque, même si SecurityContextLogoutHandler appels session.invalidate()
JSESSIONID
ne pas être effacés. Sa valeur est restée la même.J'ai essayé d'utiliser
delete-cookies="JSESSIONID"
de la même façon que l'OP essayé, et je crois que j'ai eu le même problème: Le chemin d'accès défini pour le cookie a été le chemin de contexte sans/
à la fin, donc ce ne serait pas encore effacé (Il était en train de donner la commande pour supprimer un cookie qui n'existait pas).J'ai fini par écrire mon propre
ProperCookieClearLogoutHandler
, qui est identiques CookieClearLogoutHandler sauf pour la ligne qui définit le chemin de contexte pour le cookie:Puis j'ai mis la config pour le LogoutFilter sur
spring-security.xml
de cette façon;String cookiePath = request.getContextPath() + "/"; if (!StringUtils.hasLength(cookiePath)) { cookiePath = "/"; }
est le problème si le chemin a déjà un/
par exemple si c'est la racine. C'est peut-être mieuxString cookiePath = request.getContextPath(); if (!cookiePath.endsWith("/")) { cookiePath += "/"; }
C'est comment je invalider sessions:
La valeur par défaut CookieClearingLogoutHandler fournis par le printemps ne pouvait pas effacer JSESSIONID due à une différence de chemin de cookie.
Vous ne devez pas modifier le chemin d'accès de cookie. Ce serait changer le témoin de l'identité. Si le cookie a été fixé à un chemin comme /foo et de vous changer en /, alors le client de ne pas associer le changement de cookie avec l'original cookie plus. Un cookie est identifié par le nom et le chemin d'accès.
Donc vous avez besoin pour mettre en œuvre une coutume CookieClearingLogoutHandler comme indiqué dans la solution ci-dessus j'ai.e (ProperCookieClearingLogoutHandler.class) et réglez-le printemps de sécurité comme indiqué dans le code ci-dessous .Au lieu d'utiliser .deleteCookies("JSESSIONID","UTILISATEUR") qui ajoute CookieClearingLogoutHandler par défaut.
Printemps de Sécurité Java config:
Comment supprimer sur log out est simple:
vous mettre en œuvre de déconnexion et de placer ce code dans la méthode:
Invalidé session fera le cookie valide.
Mais j'ai essayé et trouvé, que lorsque je ferme le navigateur, sans déconnexion, le cookie JSESSIONID survit et à l'utilisateur de pouvoir entrer dans le système , lorsque s'ouvre le navigateur.
Pour éliminer ce que j'ai créé un filtre, qui invalide la session lors de la connexion, aussi, la création d'une nouvelle session, où votre connexion sera effectué à partir de démarrer.