Est-ce que la sécurité Acegi / Spring prend en charge getUserPrincipal ()?
-
10-07-2019 - |
Question
Je dois interfacer une application existante avec la sécurité Acegi / Spring.
Pour commencer, je cherche une information simple: dans ce contexte, HttpServletRequest.getUserPrincipal () appelé depuis mon application retournera-t-il correctement le nom d'utilisateur obtenu via Spring (par opposition à l'utilisation d'objets spécifiques à Spring)? J'ai des informations contradictoires sur Google à ce sujet.
Je suppose que si Acegi est implémenté avec des filtres, il est capable de surcharger le getUserPrincipal () de l'API Servlet, n'est-ce pas?
Question subsidiaire: si ce n'est pas le cas par défaut, existe-t-il un moyen de l'activer?
Merci,
-Erik
La solution
Comme les utilisateurs précédents ont répondu, Spring Security prend en charge les méthodes getUserPrincipal et isUserInRole. Voici comment la sécurité de printemps fait.
Lorsque vous configurez spring, il peut charger les filtres suivants:
Dans la configuration de filtre standard, le filtre SecurityContextHolderAwareRequestFilter
est chargé.
Vous pouvez le voir encapsuler et modifier l'objet HttpServletRequest
en SecurityContextHolderAwareRequestWrapper
, qui étend HttpServletRequestWrapper
, qui implémente HttpServletRequest
et transmettez-le à la chaîne de filtres de servlets standard doFilter. Dans la mesure où le filtre de sécurité Spring doit être configuré en tant que premier filtre, toutes les classes suivantes voient à la place le SecurityContextHolderAwareRequestWrapper
. Cela inclut les pages JSP ou les servlets situés derrière ce filtre.
Lorsque vous appelez isUserInRole
ou getUserPrincipal
depuis la page JSP, le servlet ou tout framework derrière ce filtre, il appelle le HttpServletRequest
implémentation de Spring Security.
Autres conseils
Si vous utilisez le filtre de sécurité, c'est le cas. Je crois que c'est le comportement par défaut.
La classe à laquelle vous appartenez dépend exactement de votre configuration, mais elles implémentent toutes l'interface Principal par le biais de l'interface propre de Spring, org.springframework.security.Authentication, qui l'étend.
J'ai utilisé request.getUserPrincipal () et request.isUserInRole () dans une application Spring et cela fonctionne de manière transparente, même au sein des JSP.
Je pense que Spring Security stocke ces informations dans le SecurityContext et non dans la requête. Vous pouvez facilement écrire un FilterSecurityInterceptor pouvant être configuré pour ajouter également cette information à la demande.