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

Est-ce que Userprincipal que je récupère à partir de SecurityContextHolder lié aux requêtes ou aux sessions?

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

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

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 les informations obtenues du {@link SecurityContextRepository} configuré avant la demande et les stocke dans le référentiel une fois la requête terminée et en effaçant le titulaire du contexte. Par défaut, il utilise un {@link HttpSessionSecurityContextRepository}. Voir cette classe pour plus d’informations sur les options de configuration liées à HttpSession.

Btw: HttpSessionSecurityContextRepository est la seule implémentation de SecurityContextRepository (j’ai trouvé dans les libs par défaut)

Cela fonctionne comme ceci:

  • HttpSessionSecurityContextRepository utilise httpSession (Key = “SPRING_SECURITY_CONTEXT”) pour stocker un object SecurityContext .
  • SecurityContextPersistenceFilter est un filtre qui utilise un SecurityContextRepository par exemple HttpSessionSecurityContextRepository pour charger et stocker SecurityContext objects SecurityContext . 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 possède 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, 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 requête, il est placé dans un thread local à partir duquel vous y accédez.