Mon entreprise a évalué Spring MVC pour déterminer si nous devrions l'utiliser dans l'un de nos prochains projets. Jusqu'à présent, j'aime ce que j'ai vu, et en ce moment, je jette un coup d'œil au module Spring Security pour déterminer si nous pouvons/devons l'utiliser.
Nos exigences en matière de sécurité sont assez basiques ; un utilisateur doit simplement pouvoir fournir un nom d'utilisateur et un mot de passe pour pouvoir accéder à certaines parties du site (par exemple pour obtenir des informations sur son compte) ; et il y a une poignée de pages sur le site (FAQ, Support, etc.) où un utilisateur anonyme devrait pouvoir accéder.
Dans le prototype que j'ai créé, j'ai stocké un objet "LoginCredentials" (qui contient juste le nom d'utilisateur et le mot de passe) dans Session pour un utilisateur authentifié ; certains contrôleurs vérifient si cet objet est en session pour obtenir une référence au nom d'utilisateur connecté, par exemple. Je cherche à remplacer cette logique maison par Spring Security, ce qui aurait l'avantage de supprimer toute sorte de "comment suivre les utilisateurs connectés ?" et "comment authentifier les utilisateurs ?" de mon code de contrôleur/business.
Il semble que Spring Security fournisse un objet "context" (par thread) pour pouvoir accéder aux informations de nom d'utilisateur/principal depuis n'importe où dans votre application...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... ce qui semble très peu printanier puisque cet objet est un singleton (global), d'une certaine manière.
Ma question est la suivante : si c'est la façon standard d'accéder aux informations sur l'utilisateur authentifié dans Spring Security, quelle est la façon acceptée d'injecter un objet d'authentification dans le SecurityContext afin qu'il soit disponible pour mes tests unitaires lorsque ceux-ci nécessitent un utilisateur authentifié ?
Dois-je le faire dans la méthode d'initialisation de chaque scénario de test ?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Cela semble trop verbeux. Existe-t-il un moyen plus simple ?
Le site SecurityContextHolder
l'objet lui-même semble très peu printanier...