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.phpPHPuse 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.yamlYAMLsecurity:
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.