Symfony 8.2 Nouveauté Publié le

Redemander le mot de passe avant les pages sensibles

IS_AUTHENTICATED_RECENTLY et IS_AUTHENTICATED_VERY_RECENTLY : un « mode sudo » qui redemande le mot de passe quand la connexion date.

Notions abordées : Security

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 :

  1. Les factures demandent une connexion de moins d'une heure.
  2. Le changement d'adresse e-mail — qui permettrait de réinitialiser le mot de passe — demande une connexion de moins de dix minutes.
  3. Quand la connexion est trop ancienne, ConfirmerIdentite renvoie 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.

D'où vient la fonctionnalité : la pull request d'origine.