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?
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.