Mon entreprise évalue Spring MVC pour déterminer si nous devons 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 c'est quelque chose que nous pouvons / devrions utiliser.
Nos exigences en matière de sécurité sont assez basiques; un utilisateur a juste besoin de 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.) auxquelles un utilisateur anonyme devrait avoir accès.
Dans le prototype que j'ai créé, j'ai stocké un objet "LoginCredentials" (qui contient juste un nom d'utilisateur et un 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 locale par Spring Security à la place, ce qui aurait l'avantage de supprimer toute sorte de "comment suivre les utilisateurs connectés?" et "comment authentifier les utilisateurs?" à partir de mon contrôleur / code métier.
Il semble que Spring Security fournisse un objet "context" (par thread) pour pouvoir accéder au nom d'utilisateur / aux informations principales de n'importe où dans votre application ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... ce qui semble très peu Spring car cet objet est un singleton (global), d'une certaine manière.
Ma question est la suivante: si c'est le moyen standard d'accéder aux informations sur l'utilisateur authentifié dans Spring Security, quelle est la manière acceptée d'injecter un objet Authentication dans le SecurityContext afin qu'il soit disponible pour mes tests unitaires lorsque les tests unitaires nécessitent un Utilisateur authentifié?
Dois-je câbler cela dans la méthode d'initialisation de chaque cas de test?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Cela semble trop verbeux. Y a-t-il un moyen plus simple?
L' SecurityContextHolder
objet lui-même semble très différent du printemps ...