Skip to Content

Terrain 10 — Sécurité

🔍 Renfort : Partie 10.

1. Firewall API stateless ⭐⭐

🕹️ Mission : quelle config rend le firewall /api stateless (JWT) ?

✅ Solution

api: pattern: ^/api stateless: true jwt: ~

2. Ordre des firewalls ⭐⭐

🕹️ Mission : pourquoi api doit-il être déclaré avant main ?

✅ Solution

Un seul firewall s’applique (ordre de haut en bas). main (sans pattern) capterait /api s’il était avant → le JWT ne s’appliquerait pas.

3. Hacher un mot de passe ⭐⭐

🕹️ Mission : hacher plainPassword à l’inscription.

✅ Solution

$user->setPassword($this->hasher->hashPassword($user, $input->plainPassword));

4. Voter ⭐⭐⭐

🕹️ Mission : un BookingVoter : seul le propriétaire (ou admin) peut CANCEL.

✅ Solution

protected function voteOnAttribute(string $a, mixed $s, TokenInterface $t): bool { $u = $t->getUser(); if (!$u instanceof User) return false; if (in_array('ROLE_ADMIN', $u->getRoles(), true)) return true; return $a === 'CANCEL' && $s->getUser() === $u; }

5. Utiliser le voter ⭐⭐

🕹️ Mission : refuser (403) une annulation non autorisée dans un contrôleur.

✅ Solution

$this->denyAccessUnlessGranted('CANCEL', $booking);

6. Endpoint de login JWT ⭐⭐⭐

🕹️ Mission : quel endpoint et quelle config renvoient un JWT ?

✅ Solution

POST /api/login_check, via un firewall en json_login (LexikJWT), qui renvoie { token }.

7. Sécuriser une opération API ⭐⭐⭐

🕹️ Mission : réserver la suppression aux admins sur une resource API. 🔍 11.5.

✅ Solution

new Delete(security: "is_granted('ROLE_ADMIN')")

8. Collection filtrée par user ⭐⭐⭐⭐⭐

🕹️ Mission : un utilisateur ne doit voir que ses réservations en collection. Voter par item suffit-il ?

✅ Solution

Non (fuite via total/pagination) : une extension de collection Doctrine ajoutant WHERE user = current au niveau SQL.

9. Login throttling ⭐⭐

🕹️ Mission : limiter à 5 tentatives/min sur le back-office.

✅ Solution

main: login_throttling: { max_attempts: 5, interval: '1 minute' }

10. Où stocker le JWT (Next.js) ⭐⭐⭐

🕹️ Mission : pourquoi pas localStorage ? Alternative ?

✅ Solution

localStorage = lisible par JS → vol par XSS. Alternative : cookie httpOnly posé côté serveur Next.js.


Terrain suivant : API Platform.