Sécurité de printemps - impossible de se déconnecter
Je rénovés mon GWT/GXT application avec LDAP de base de l'Autorisation de l'utilisation de base de l'authentification HTTP. Il fonctionne bien quand j'ai commencer à nouveau navigateur - je obtenir l'invite de commandes et d'obtenir autorisé contre LDAP de l'entreprise. Mon problème - je ne peux pas déconnecter à moins que j'ai fermer/rouvrir le navigateur. Je peux débogage et de voir comment SecurityContextLogoutHandler#logout
est appelé et le code suivant est exécuté
if (invalidateHttpSession) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
}
SecurityContextHolder.clearContext();
Cependant, il a apparemment aucun effet tant que le site est rechargé et je n'ai jamais obtenir un autre HTTP auth invite à moins que je redémarre le navigateur (même vider le cache/cookies ne va pas aider). Voici la partie pertinente de applicationContext.xml
<security:http auto-config='true'>
<security:intercept-url pattern="/reports/**" access="ROLE_USER" />
<security:http-basic />
<security:logout logout-url="/reports/logout"
logout-success-url="/reports/Application.html" />
</security:http>
J'ai essayé de définir des LogoutSuccessHandler
et ne authentication.setAuthenticated(false);
mais qui n'a pas d'effet
Rien ici, je suis en manque ici? Votre aide sera très appréciée
source d'informationauteur Bostone | 2011-02-17
Vous devez vous connecter pour publier un commentaire.
OK. après avoir passé beaucoup trop de temps avec cela, je pense que j'ai la réponse. C'est simple: on ne peut pas renflouer de l'authentification HTTP de base à l'aide de technologie côté serveur. Fondamentalement, l'autorisation de la chaîne est en base 64 décodé dans l'en-tête HTTP et quand elle est protégée de la page est chargée dans le navigateur de l'émission de jeton de sécurité obtient repeuplé donc, peu importe combien de fois vous l'effacer sur le serveur, il obtient ressuscité à chaque fois que la page est appelée. Je suppose qu'il est possible de jouer à certains trucs astucieux côté navigateur, mais ce serait cassants et fragiles
Pour mon cas, j'ai décidé de passer à la forme d'authentification qui donne un bien meilleur contrôle de la connexion/déconnexion du processus, de toute façon.
Je vais tenir sur l'acceptation de ma propre réponse favorable à quelqu'un de sortir avec solution acceptable
Bostone est fondamentalement correct que vous ne pouvez pas gérer ce côté serveur. Il est, cependant, un peu un hack qui est disponible.
La réponse courte est de rediriger l'utilisateur vers l'URL que vous voulez à la terre, mais préfixe avec un mauvais nom d'utilisateur suivi de
@
. Donc, comme une vilaine exemple,Idéalement, vous mettriez un gestionnaire qui ferait cela pour vous, mais pour des fins d'illustration, je pense que reçoit le concept à travers.
Euh... étrange. Je ne vois rien de mal avec votre configuration. Vous n'avez pas vraiment besoin de définir personnalisé déconnexion gestionnaire, car il doit être manipulé par un Ressort de Sécurité.
Essayer cela, au lieu de définir votre
logout-url
utilisez le lien de déconnexion par défaut:-Ensuite, utilisez
/j_spring_security_logout
de vous déconnecter.Fait ce travail?
juste mis invalider la session "vrai" et de voir cela fonctionne.
vérifier si ce listner est là, dans votre web.xml:
Si les choses ne fonctionnent pas, alors vous pouvez essayer la solution suivante.
Je pense que le problème est avec votre ligne suivante,
Ligne ci-dessus signifie que vous avez ajouté l'accès ROLE_USER à yout '/rapports/**' lien.
Mais après déconnexion vous donnez la même url de déconnexion succès. alors comment cela va fonctionner?
Modifier l'emplacement de votre déconnexion du succès de la page ou vous pouvez ajouter followin ligne http tag.
Je crois fermement que vous êtes correct. Vous ne pouvez pas annuler une Base ou l'authentification Digest w/o de le faire dans le navigateur. Même là, il va être extrêmement difficile, voire impossible. Franchement, je ne peux même pas penser à une façon de le faire (autre que d'essayer de fermer le navigateur).
Comme vous l'avez noté, le problème est que même si vous violez tout sur le côté serveur, vous avez donné le navigateur tout ce dont il a besoin pour générer automatiquement une nouvelle session d'authentification sur son propre. La seule façon d'effacer c'est-à-claire le navigateur. Même le redémarrage de votre serveur ne sera pas évident de désactiver la capacité du navigateur pour créer une nouvelle authentification qui est une assez bonne indication que vous n'allez pas être en mesure d'accomplir cette sur le côté serveur, sans invalider la Base ou de l'authentification Digest contrat.
Franchement cela semble être une très importante faille de sécurité dans les navigateurs que vous ne devez jamais laisser un navigateur en cours d'exécution sur un serveur d'accès à l'issue de l'authentification dans un site de base ou de l'authentification digest.
Formulaire d'authentification peut être votre meilleur pari parce que là, vous ne sont pas de donner le navigateur de l'information sur la façon de ressusciter une authentification, sauf si vous autorisez un rememberme cookie. Même là, vous pouvez effacer le cookie lors de la déconnexion de sorte que c'est plus facile.
Un moyen que j'ai trouvé à faire, c'est revenir HTTP 401 réponses. Rapidement quelques tests montrent que cela fonctionne dans le macOS versions de Safari, Chrome & Firefox. Le code que j'utilise est essentiellement équivalent à ceci:
Le truc, c'est que vous avez généralement besoin de retourner la 401 en-tête de deux fois après le premier, le navigateur va réessayer avec ses mises en cache des informations d'identification de l'envoi de l'Autorisation d'en-tête, à quel point nous détruire de l'utilisateur vieux session), le second semble évident et demande un login.