🛡️ Contrôle d'accès - 0x485254/brief-26 GitHub Wiki

🛡️ Contrôle d'accès : Accès sécurisé aux listes (/api/lists)

🎯 Objectif

Empêcher un utilisateur connecté d'accéder aux listes créées par un autre utilisateur.


🔧 Fonctionnement global de la sécurité

1. Authentification via JWT

  • La classe JwtAuthFilter extrait l’e-mail du token JWT et rĂ©cupère l’utilisateur en base.
  • L’utilisateur est injectĂ© dans le SecurityContextHolder.
  • Cela permet l’utilisation de @AuthenticationPrincipal dans les contrĂ´leurs.
@AuthenticationPrincipal User user

2. Accès aux listes : injection implicite de l’utilisateur connecté

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

➡️ Aucun userId n’est fourni par le client.
➡️ Le backend utilise l’utilisateur connecté pour filtrer ses propres listes.


3. Filtrage au niveau du service

public List<UserList> getListsByUser(User user) {
    return listRepository.findByUser(user); // Ne retourne que SES listes
}

4. Accès à une seule liste : protection stricte

Lorsqu’un utilisateur tente de récupérer une liste via /api/lists/{id} :

public UserList getListOwnedByUser(User user, UUID listId) {
    return listRepository.findById(listId)
        .filter(list -> list.getUser().getId().equals(user.getId()))
        .orElseThrow(() -> new ResponseStatusException(HttpStatus.FORBIDDEN));
}

➡️ Si l’utilisateur n’est pas le propriétaire de la liste, une erreur 403 Forbidden est levée.


✅ Résumé des bonnes pratiques utilisées

Composant RĂ´le
JwtAuthFilter Authentifie l’utilisateur via le JWT
SecurityContextHolder Rend l’utilisateur disponible pour toute la requête
@AuthenticationPrincipal Injecte automatiquement le User connecté dans les méthodes
ListService.getListOwnedByUser Vérifie l’autorisation d’accès à la ressource
Pas de userId côté frontend Évite le contournement de sécurité

❌ Mauvaises pratiques à éviter

  • ❌ Passer un userId en paramètre de requĂŞte (?userId=...)
  • ❌ Ne pas vĂ©rifier le propriĂ©taire d’une ressource
  • ❌ Se fier uniquement au frontend pour gĂ©rer les droits
⚠️ **GitHub.com Fallback** ⚠️