web-dev-qa-db-fra.com

SecurityContextHolder de Spring security: session ou demande liée?

L'utilisateurprincipal que je récupère de SecurityContextHolder est-il lié aux demandes ou aux 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?

60
chzbrgla

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

Dans une application Web, vous utiliserez le ThreadLocalSecurityContextHolderStrategy qui interagit avec SecurityContextPersistenceFilter .

Le doc Java de SecurityContextPersistenceFilter commence par:

Remplit le {@link SecurityContextHolder} avec des informations obtenues à partir du {@link SecurityContextRepository} configuré avant la demande et le stocke dans le référentiel une fois la demande terminée et efface le titulaire du contexte. Par défaut, il utilise un {@link HttpSessionSecurityContextRepository}. Consultez cette classe pour plus d'informations sur les options de configuration liées à HttpSession.

Btw: HttpSessionSecurityContextRepository est la seule implémentation de SecurityContextRepository (que j'ai trouvée dans les bibliothèques par défaut)

Cela fonctionne comme ceci:

  • HttpSessionSecurityContextRepository utilise la session http (Key = "SPRING_SECURITY_CONTEXT") pour stocker un objet SecurityContext.
  • SecurityContextPersistenceFilter est un filtre qui utilise un SecurityContextRepository par exemple le HttpSessionSecurityContextRepository pour charger et stocker SecurityContext objets. Si un HttpRequest passe le filtre, le filtre récupère le SecurityContext du référentiel et le place dans le SecurityContextHolder (SecurityContextHolder#setContext)
  • SecurityContextHolder a deux méthodes setContext et getContext. Les deux utilisent un SecurityContextHolderStrategy pour spécifier exactement ce qui est fait dans les méthodes set- et get-Context. - Par exemple, le ThreadLocalSecurityContextHolderStrategy utilise un thread local pour stocker le contexte.

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

109
Ralph