72 votes

Comment déconnecter manuellement un utilisateur avec la sécurité du printemps ?

La réponse est probablement simple : Comment puis-je déconnecter manuellement l'utilisateur actuellement connecté dans spring security ? Est-il suffisant d'appeler :

SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); 

?

0 votes

Merci beaucoup pour vos réponses les gars, je vais les vérifier.

73voto

Grzegorz Oledzki Points 10491

Il m'est difficile de dire avec certitude si votre code est suffisant. Cependant, l'implémentation standard de Spring-security pour la déconnexion est différente. Si vous jetez un coup d'oeil à SecurityContextLogoutHandler vous verriez qu'ils le font :

    SecurityContextHolder.clearContext();

De plus, ils invalident éventuellement la HttpSession :

    if (invalidateHttpSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }

Vous pouvez trouver plus d'informations dans une autre question sur la déconnexion dans Spring Security. et en regardant le code source de org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler .

2 votes

Vous pouvez également supprimer le cookie Rememberme s'il est activé.

40voto

killer_PL Points 1821

Dans le conteneur Servlet 3.0, la fonctionnalité de déconnexion de Spring est intégrée à la servlet et il suffit d'invoquer logout() sur votre HttpServletRequest . Il faut encore écrire un contenu de réponse valide.

Selon documentation (Printemps 3.2) :

La méthode HttpServletRequest.logout() peut être utilisée pour déconnecter l'utilisateur actuel.

Typiquement, cela signifie que le SecurityContextHolder sera effacé. le HttpSession sera invalidé, toute authentification "Remember Me" sera nettoyée, etc. sera nettoyée, etc.

0 votes

Avoir un NPE au niveau de Tomcat 7 org.apache.catalina.connector.Request#logout pour Spring 3.1.2 / Grails 2.2.0. Aucune erreur de ce type avec clearContext() .

0 votes

@PavelVlasov Je pense que c'est une erreur dans la configuration de Spring, lisez le SecurityContextHolder.

4 votes

Après request.logout() J'ai toujours un utilisateur autorisé dans SecurityContextHolder.getContext().getAuthentication()

26voto

gibaholms Points 96

J'utilise le même code dans LogoutFilter, en réutilisant les LogoutHandlers comme suit :

public static void myLogoff(HttpServletRequest request, HttpServletResponse response) {
    CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
    SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
    cookieClearingLogoutHandler.logout(request, response, null);
    securityContextLogoutHandler.logout(request, response, null);
}

1 votes

+1 à cause de CookieClearingLogoutHandler sinon l'utilisateur peut se reconnecter s'il avait le cookie rememberme. Notez que cette classe nécessite spring 3.1

10voto

James Points 1936

Pour déconnecter un utilisateur dans une application Web, vous pouvez également le rediriger vers la page de déconnexion. Le LogoutFilter fait alors tout le travail à votre place.

L'url de la page de déconnexion est définie dans la configuration de la sécurité :

<sec:http ...>
  ...
  <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
  ...
</sec:http>

1 votes

Ça n'a pas marché pour moi. Ce n'est pas aussi simple que vous le suggérez. Vous avez d'autres détails de configuration ?

0 votes

Il ne devrait y avoir aucune autre configuration nécessaire pour que cela fonctionne. Vous redirigez simplement l'utilisateur vers une URL comme " exemple.com/votrectx/logout ".

0 votes

J'ai réussi à le faire fonctionner mais j'ai dû redémarrer Tomcat pour que cela fonctionne.

10voto

Ritesh Points 2992

Vous pouvez également utiliser SessionRegistry comme :

sessionRegistry.getSessionInformation(sessionId).expireNow();

Si vous voulez forcer la déconnexion dans toutes les sessions d'un utilisateur, utilisez alors getAllSessions et appeler la méthode expireNow de chaque information de session.

Editar
Cela nécessite ConcurrentSessionFilter (ou tout autre filtre de la chaîne), qui vérifie SessionInformation et appelle tous les gestionnaires de déconnexion, puis effectue une redirection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X