🔐 Spring Security - 0x485254/brief-26 GitHub Wiki

Utilisateur connecté et SecurityContextHolder

🎯 Objectif

Comprendre comment Spring Security gère l'utilisateur connecté via SecurityContextHolder et comment cela s'intègre dans une application avec JWT.


🧱 Qu'est-ce que SecurityContextHolder ?

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.

⚙️ Fonctionnement dans un projet JWT

  1. Un utilisateur s'authentifie en envoyant un JWT (Authorization: Bearer ...)
  2. Le JwtAuthFilter intercepte la requête :
    SecurityContextHolder.getContext().setAuthentication(authToken);
  3. Cela enregistre l’utilisateur dans le contexte courant.
  4. Tu peux maintenant injecter l’utilisateur automatiquement :
    @AuthenticationPrincipal User user

📌 Exemple dans un filtre JWT

if (email != null && SecurityContextHolder.getContext().getAuthentication() == null) {
    userRepository.findByEmail(email).ifPresent(user -> {
        var authToken = new UsernamePasswordAuthenticationToken(user, null, null);
        SecurityContextHolder.getContext().setAuthentication(authToken);
    });
}

📥 Lecture manuelle de l'utilisateur courant

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.isAuthenticated()) {
    User user = (User) auth.getPrincipal();
}

✅ Utilisation dans un contrôleur

@GetMapping
public List<ListDto> getLists(@AuthenticationPrincipal User user) {
    return listService.getListsByUser(user);
}

➡️ L'utilisateur injecté correspond à celui authentifié via le JwtAuthFilter.


❌ Ce que SecurityContextHolder ne fait pas

  • 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));
}

🧠 Résumé

É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

🔗 Ressources

⚠️ **GitHub.com Fallback** ⚠️