Comment authentifier manuellement un utilisateur avec Spring Security

Comment authentifier manuellement un utilisateur avec Spring Security

1. Vue d'ensemble

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

2. Sécurité de printemps

En termes simples, Spring Security contient les informations principales de chaque utilisateur authentifié dans unThreadLocal - représenté comme un objetAuthentication.

Afin de construire et de définir cet objetAuthentication, 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 une authentification, puis définissons l'objetAuthentication résultant dans lesSecurityContext actuellement utilisés par le framework pour contenir l'utilisateur actuellement connecté:

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

Après avoir défini lesAuthentication dans le contexte, nous allons maintenant pouvoir vérifier si l'utilisateur actuel est authentifié - à l'aide desecurityContext.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é (classeSecurityContextPersistenceFilter).

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

Donc, afin de définir l'authentification sur la demande et donc,make it available for all subsequent requests from the client, nous devons définir manuellement lesSecurityContext contenant lesAuthentication 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 unHttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY importé statiquement.

Il convient de noter que nous ne pouvons pas utiliser directement lesHttpSessionSecurityContextRepository - car cela fonctionne en conjonction avec lesSecurityContextPersistenceFilter.

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é par-dessus la réponse transmise à la chaîne.

Dans ce cas, vous devez donc 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'utilisateurAuthentication dans le contexte de Spring Security et comment il peut être rendu disponible à 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 échantillons de code peuvent être trouvésover on GitHub.