veilletech.fr
1 oct. Feed du jour
#05 SYMFONY Article

Symfony 8.2 : le mode sudo redemande le mot de passe

Être connecté ne dit pas quand vous l'avez prouvé.

Symfony 8.2 ajoute un mode sudo : IS_AUTHENTICATED_RECENTLY (identifiants saisis dans les deux dernières heures) et IS_AUTHENTICATED_VERY_RECENTLY (cinq minutes) protègent les actions sensibles, et un point d'entrée de réauthentification redemande le mot de passe au lieu de renvoyer une 403. Une session tenue par un cookie remember-me ne passe jamais ces contrôles.

2 min de lectureintermédiairevidéo 1:22
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Deux attributs de récence
  3. Redemander plutôt que refuser
  4. Aller plus loin que l'horloge
  5. À retenir

Ce qui se passe

IS_AUTHENTICATED_FULLY est jusqu'ici le contrôle le plus exigeant de Symfony sur la connexion. Il dit si l'utilisateur a tapé ses identifiants, pas il y a combien de temps. Une session ouverte le matin sur un portable resté déverrouillé suffit donc, l'après-midi, à payer ou à supprimer le compte. Symfony 8.2 ajoute un mode sudo, sur le modèle de GitHub : redemander les identifiants avant une action sensible. La fonction est signée Nicolas Grekas.

Deux attributs de récence

Attribut Identifiants saisis depuis moins de
IS_AUTHENTICATED_RECENTLY 2 heures
IS_AUTHENTICATED_VERY_RECENTLY 5 minutes

Ils s'emploient comme les autres IS_AUTHENTICATED_*, y compris dans access_control et dans Twig, et les expressions de sécurité gagnent is_recently_authenticated() et is_very_recently_authenticated(). Les deux durées se règlent, en secondes, dans la configuration de sécurité.

src/Controller/AccountController.phpPHP
use Symfony\Component\Security\Http\Attribute\IsGranted;

#[IsGranted('IS_AUTHENTICATED_RECENTLY')]
public function changeEmail(): Response { /* … */ }

#[IsGranted('IS_AUTHENTICATED_VERY_RECENTLY')]
public function deleteAccount(): Response { /* … */ }
config/packages/security.yamlYAML
security:
    access_control:
        - { path: ^/account/delete, roles: IS_AUTHENTICATED_VERY_RECENTLY }

Une session rétablie par un cookie remember-me n'y satisfait jamais : ce cookie sert à quiconque a la main sur le navigateur, il faut donc se reconnecter.

Redemander plutôt que refuser

Par défaut, un refus produit une 403. Pour proposer une nouvelle saisie puis revenir à la page demandée, on implémente ReAuthenticationEntryPointInterface et on le déclare avec l'option de pare-feu re_authentication_entry_point — inutile si le point d'entrée du pare-feu implémente déjà l'interface.

C'est le cas du login OpenID Connect de la 8.2 : il renvoie l'utilisateur chez son fournisseur avec prompt=login. Symfony lit aussi le claim auth_time du jeton d'identité, si bien qu'une reconnexion silencieuse sur une vieille session chez le fournisseur ne passe pas pour une saisie fraîche.

Aller plus loin que l'horloge

Ces contrôles sont tranchés par un résolveur de confiance. On l'étend en surchargeant isAuthenticatedRecently() ou isAuthenticatedVeryRecently(), par exemple pour exiger, en plus des cinq minutes, qu'une clé matérielle ait servi pendant la session. Le jeton note désormais quelles méthodes d'authentification ont été employées et quand, avec les noms de la RFC 8176 : l'authentificateur OIDC les lit dans le claim amr, un authentificateur maison les déclare avec AuthenticationMethodBadge.

Source : New in Symfony 8.2: Sudo Mode, Symfony, 30 septembre 2026. Voir aussi la documentation.