Nouveau dans Symfony 8.2 (en développement). IS_AUTHENTICATED_FULLY dit comment la session a commencé — par un mot de passe, pas par un cookie « se souvenir de moi » — mais pas quand. Une utilisatrice connectée ce matin, qui laisse son ordinateur ouvert au déjeuner, passe toujours le contrôle. GitHub et d'autres redemandent le mot de passe avant les actions sensibles : c'est le « mode sudo », que Symfony 8.2 apporte.
Deux nouveaux attributs
#[IsGranted('IS_AUTHENTICATED_RECENTLY')] // mot de passe donné il y a moins de 2 h #[IsGranted('IS_AUTHENTICATED_VERY_RECENTLY')] // il y a moins de 5 min
Ils marchent partout où marchent les autres IS_AUTHENTICATED_* : access_control, Twig, expressions de sécurité. Le jeton retient désormais, à chaque connexion interactive, la date à laquelle l'utilisateur a prouvé son identité (ici, en donnant son mot de passe) ; une session ouverte par cookie « se souvenir de moi » n'en a pas, et échoue donc aux deux.
Les durées se règlent dans security.yaml, en secondes :
security: recent_authentication_lifetime: 7200 very_recent_authentication_lifetime: 300
Plutôt qu'un 403
Par défaut, un échec donne un 403. Pour envoyer l'utilisateur redonner son mot de passe, on écrit un point d'entrée de réauthentification et on le déclare sur le pare-feu :
final class ConfirmerIdentite implements ReAuthenticationEntryPointInterface { public function startReAuthentication(Request $request, TokenInterface $token): Response { // … } }
security: firewalls: main: re_authentication_entry_point: App\Security\ConfirmerIdentite
Le pare-feu retient la page demandée avant d'appeler le point d'entrée : une fois le mot de passe redonné, form_login y ramène l'utilisateur.
À faire
L'espace client d'Ada (ada / lovelace) ouvre tout à toute session. Durcissez-le :
- Les factures demandent une connexion de moins d'une heure.
- Le changement d'adresse e-mail — qui permettrait de réinitialiser le mot de passe — demande une connexion de moins de dix minutes.
- Quand la connexion est trop ancienne,
ConfirmerIdentiterenvoie vers/connexion, qui demande alors seulement le mot de passe ; après quoi Ada revient sur la page qu'elle voulait.
L'accueil du compte, /compte, reste ouvert à toute session.