Comment authentifier manuellement l'utilisateur avec Spring Security

1. Vue d'ensemble

Dans cet article rapide, nous allons nous concentrer sur la façon de définir par programme un utilisateur authentifié dans Spring Security et Spring MVC.

2. Spring Security

En termes simples, Spring Security contient les informations principales de chaque utilisateur authentifié dans un ThreadLocal - représenté comme un objet d' authentification .

Afin de construire et de définir cet objet d' authentification , nous devons utiliser la même approche que Spring Security utilise généralement pour créer l'objet sur une authentification standard.

Pour, déclenchons manuellement l'authentification, puis définissons l' objet Authentication résultant dans le SecurityContext actuel utilisé par le framework pour contenir l'utilisateur actuellement connecté:

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth);

Après avoir défini l' authentification dans le contexte, nous pourrons maintenant vérifier si l'utilisateur actuel est authentifié - en utilisant securityContext.getAuthentication (). IsAuthenticated () .

3. Spring MVC

Par défaut, Spring Security ajoute un filtre supplémentaire dans la chaîne de filtres Spring Security - qui est capable de conserver le contexte de sécurité ( classe SecurityContextPersistenceFilter ).

À son tour, il délègue la persistance du contexte de sécurité à une instance de SecurityContextRepository , par défaut à la classe HttpSessionSecurityContextRepository .

Ainsi, afin de définir l'authentification sur la demande et donc de la rendre disponible pour toutes les demandes ultérieures du client , nous devons définir manuellement le SecurityContext contenant l' authentification dans la session HTTP:

public void login(HttpServletRequest req, String user, String pass) { UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSession session = req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc); }

SPRING_SECURITY_CONTEXT_KEY est un HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY importé statiquement .

Il convient de noter que nous ne pouvons pas utiliser directement HttpSessionSecurityContextRepository - car il fonctionne en conjonction avec SecurityContextPersistenceFilter.

En effet, le filtre utilise le référentiel pour charger et stocker le contexte de sécurité avant et après l'exécution du reste des filtres définis dans la chaîne, mais il utilise un wrapper personnalisé sur la réponse qui est transmise à la chaîne.

Donc, dans ce cas, vous devez connaître le type de classe du wrapper utilisé et le transmettre à la méthode de sauvegarde appropriée dans le référentiel.

4. Conclusion

Dans ce tutoriel rapide, nous avons expliqué comment définir manuellement l' authentification de l'utilisateur dans le contexte de Spring Security et comment elle peut être mise à disposition à des fins de Spring MVC, en nous concentrant sur les exemples de code qui illustrent le moyen le plus simple d'y parvenir.

Comme toujours, des exemples de code peuvent être trouvés sur GitHub.