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.