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.