60 votes

SecurityContextHolder de la sécurité Spring: session ou demande liée?

Est-ce que l'utilisateur principal que je récupère de SecurityContextHolder lié à des requêtes ou à des sessions?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

C’est ainsi que j’accède à l’utilisateur actuellement connecté. Cela invalidera-t-il si la session en cours est détruite?

110voto

Ralph Points 42744

Il dépend de la façon dont vous avez configuré (ou disons, vous pouvez configurer un comportement différent).

Dans une application Web, vous allez utiliser l' ThreadLocalSecurityContextHolderStrategy qui interagit avec d' SecurityContextPersistenceFilter.

La Java Doc de SecurityContextPersistenceFilter commence par:

Remplit le {@link SecurityContextHolder} avec les informations obtenues à partir de la configuré {@link SecurityContextRepository} avant la demande et la stocke dans le dos référentiel une fois que la demande a achevé et de compensation le contexte le titulaire. Par défaut, il utilise un {@link HttpSessionSecurityContextRepository}. Voir cette classe pour plus d'informations HttpSession liées les options de configuration.

Btw: HttpSessionSecurityContextRepository est le seul de la mise en œuvre de SecurityContextRepository (j'ai trouvé dans le défaut libs)

Il fonctionne comme ceci:

  • L' HttpSessionSecurityContextRepository utilise le httpSession (Key="SPRING_SECURITY_CONTEXT") pour stocker une SecurityContext Objet.
  • L' SecurityContextPersistenceFilter est un filtre qui utilise un SecurityContextRepository par exemple l' HttpSessionSecurityContextRepository pour charger et stocker SecurityContext Objets. Si un HttpRequest traverse le filtre, le filtre à obtenir l' SecurityContext à partir du référentiel et de la mettre dans le SecurityContextHolder (SecurityContextHolder#setContext)
  • L' SecurityContextHolder a deux méthodes d' setContext et getContext. Les deux utilise un SecurityContextHolderStrategy de spécifier exactement ce qui est fait dans l'ensemble et Contexte des méthodes. - Par exemple, l' ThreadLocalSecurityContextHolderStrategy utilise un thread local pour stocker le contexte.

Donc en résumé: L'utilisateur principal (élément de SecurityContext) est stocké dans la Session HTTP. Et pour chaque demande, il est mis dans un thread local où vous y accédez.

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