veilletech.fr
14 oct. Feed du jour
#04 SYMFONY Article

Symfony 8.2 : la déconnexion passe en POST

Un lien de déconnexion, c'est un GET qui attend qu'un robot passe.

Symfony 8.2 permet de n'accepter que POST sur la route de déconnexion, avec les fonctions Twig logout_form() et logout_button() pour générer le formulaire. Elle permet aussi de supprimer la redirection après déconnexion (logout.target: null) et prend en charge le back-channel logout d'OpenID Connect.

2 min de lectureintermédiairevidéo 1:27
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. 1. Déconnexion en POST
  3. 2. Pas de redirection après la déconnexion
  4. 3. Déconnexion par canal arrière avec OpenID Connect
  5. Comment s'y prendre
  6. À retenir

Ce qui se passe

Se déconnecter par un simple lien pose un problème de fond : navigateurs, robots d'aperçu de liens, scanners de sécurité et proxys d'entreprise suivent les liens d'eux-mêmes, et déconnectent l'utilisateur sans qu'il l'ait demandé. Symfony 8.2 apporte trois changements autour de la déconnexion, selon le billet de blog du projet.

1. Déconnexion en POST

La solution consiste à n'accepter que les requêtes POST sur la route de déconnexion, ce qui impose un formulaire à la place du lien. Pour le construire :

Crédité à Nicolas Grekas.

2. Pas de redirection après la déconnexion

Avec une connexion JSON, on personnalisait la réponse de connexion dans un contrôleur, mais pas celle de déconnexion sans écouteur d'événement. En 8.2, logout.target à null supprime la redirection :

YAML
security:
    firewalls:
        main:
            logout:
                target: null

La requête atteint alors le contrôleur de la route de déconnexion, qui construit sa propre réponse. Crédité à Jérôme Vasseur.

3. Déconnexion par canal arrière avec OpenID Connect

La connexion OpenID Connect, nouvelle en 8.2, gère le back-channel logout : quand l'utilisateur se déconnecte chez le fournisseur d'identité, celui-ci envoie à l'application un jeton de déconnexion signé. Symfony vérifie signature et revendications, range la session terminée dans un pool de cache, et déconnecte l'utilisateur à sa prochaine requête. Crédité à Florent Morselli.

Contraintes : cela ne fonctionne qu'avec des pare-feux à état, et le pool de cache doit être partagé par tous les serveurs, sans éviction avant expiration. L'URL de déconnexion se déclare comme backchannel_logout_uri du client chez le fournisseur.

Comment s'y prendre

  1. Restreindre la route de déconnexion à POST et remplacer les liens par logout_button().
  2. En API JSON, mettre logout.target à null et répondre depuis le contrôleur.
  3. Avec OpenID Connect, déclarer l'URL de déconnexion chez le fournisseur et vérifier le pool de cache partagé.

Source : New in Symfony 8.2: Safer and More Flexible Logout, blog Symfony, 13 octobre 2026.