🔐 Spring Security - 0x485254/brief-26 GitHub Wiki
Utilisateur connecté et SecurityContextHolder
Comprendre comment Spring Security gère l'utilisateur connecté via SecurityContextHolder
et comment cela s'intègre dans une application avec JWT.
SecurityContextHolder
est une classe fournie par Spring Security qui :
- Stocke le contexte de sécurité pour chaque requête.
- Contient l'utilisateur actuellement connecté (authentifié).
- Utilise un ThreadLocal pour isoler les requêtes.
- Un utilisateur s'authentifie en envoyant un JWT (
Authorization: Bearer ...
) - Le
JwtAuthFilter
intercepte la requête :SecurityContextHolder.getContext().setAuthentication(authToken);
- Cela enregistre l’utilisateur dans le contexte courant.
- Tu peux maintenant injecter l’utilisateur automatiquement :
@AuthenticationPrincipal User user
if (email != null && SecurityContextHolder.getContext().getAuthentication() == null) {
userRepository.findByEmail(email).ifPresent(user -> {
var authToken = new UsernamePasswordAuthenticationToken(user, null, null);
SecurityContextHolder.getContext().setAuthentication(authToken);
});
}
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.isAuthenticated()) {
User user = (User) auth.getPrincipal();
}
@GetMapping
public List<ListDto> getLists(@AuthenticationPrincipal User user) {
return listService.getListsByUser(user);
}
➡️ L'utilisateur injecté correspond à celui authentifié via le JwtAuthFilter
.
- Il n’applique pas les règles de sécurité
- Il ne décide pas si un utilisateur a le droit d’accéder à une ressource
- Ce travail est fait dans les services métiers, par exemple :
public UserList getListOwnedByUser(User user, UUID listId) {
return listRepository.findById(listId)
.filter(list -> list.getUser().getId().equals(user.getId()))
.orElseThrow(() -> new ResponseStatusException(HttpStatus.FORBIDDEN));
}
Élément | Rôle |
---|---|
SecurityContextHolder |
Stocke le Authentication courant |
JwtAuthFilter |
Authentifie le user via token et le met dans le contexte |
@AuthenticationPrincipal |
Injecte automatiquement le User connecté |
Services | Vérifient que le user a le droit d'accéder à ses ressources |