Ce qui change
Symfony 7.4 avait ajouté la signature des messages dans Messenger : un message
forgé et glissé dans une file ne déclenche plus un handler sensible, comme ceux qui
lancent des commandes ou des processus. Mais elle se réglait par handler
(#[AsMessageHandler(sign: true)]), si bien que Symfony devait lire le type du
message avant de savoir si une signature était exigée : lire une donnée non
vérifiée et charger la classe qu'elle nomme.
Symfony 8.2 fait passer la signature au transport, avec une option sign :
- tous les messages envoyés vers ce transport sont signés ;
- ceux qui arrivent sans signature valide sont refusés avant d'en lire quoi que ce soit ;
- le transport d'échec est le seul transport signataire qui accepte aussi des messages venant de transports non signés, pour qu'on puisse les rejouer, mais les handlers qui exigent une signature les refusent.
Les contraintes
- Le transport d'échec et l'outbox d'un transport signataire doivent signer eux aussi, sinon le conteneur ne compile pas.
- Les messages déjà en file n'ont pas de signature valide et seront refusés : on n'active l'option que sur un transport sans message en attente.
- L'option
signdu handler est dépréciée ; en Symfony 9.0 elle ne signera plus rien, et le handler n'acceptera que les messages reçus d'un transport signataire ou traités de façon synchrone. - Symfony active déjà cette exigence sur les handlers de
RunCommandMessage,RunProcessMessageetServiceCallMessage. Si vous les traitez en asynchrone, routez-les vers un transport signataire ; sinon une dépréciation apparaît à la compilation du conteneur.
Faire tourner les secrets
Changer kernel.secret a des effets en cascade : les cookies remember-me
déconnectent leurs utilisateurs, les URI signées et les liens de connexion déjà
envoyés cessent de marcher, les messages signés en attente sont refusés, et les
identifiants produits par Uuid47Transformer changent sans qu'on puisse les
faire tourner.
Symfony 8.2 garde kernel.secret comme secret stable de l'application et donne à
chaque fonctionnalité qui signe sa propre option, qui accepte une liste : le
premier secret signe les nouvelles données, tous les secrets de la liste
vérifient. Par défaut, ces options valent kernel.secret : rien ne change tant
qu'on ne configure rien. Les messages sont resignés à chaque nouvelle tentative et
les cookies remember-me à chaque connexion, ils passent donc d'eux-mêmes au nouveau
secret.
Comment s'y prendre
- Laisser les files se vider, puis activer
signsur les transports concernés et sur leur transport d'échec. - Router vers un transport signataire les
RunCommandMessage,RunProcessMessageetServiceCallMessageasynchrones. - Pour une rotation : nouveau secret en tête de liste, ancien derrière, retiré quand les liens et URI signés avec lui ont expiré.
Source : Symfony, 21 octobre 2026. Source en anglais.