Les deux migrations

Il y a deux migrations, et les confondre coûterait au projet son adoption. L’une est gratuite et se fait le premier jour. L’autre vous revient, à votre rythme, ou jamais.

Le premier jour est gratuit

composer require spomky-labs/access-control-bundle

Enregistrez le bundle. C’est tout. Votre configuration ne bouge pas, votre code ne bouge pas, les réponses ne bougent pas. Vos votants continuent d’être consultés, #[IsGranted] est lu ici, is_granted() répond dans vos gabarits, les règles de votre security.yaml sont appliquées, et votre hiérarchie de rôles est lue depuis le service que Security a déjà construit.

Rien n’est déprécié, rien n’avertit, rien n’est à réécrire. Si un guide de migration commence par « adaptez vos votants », personne ne migre. Celui-ci ne le fait donc pas.

Puis, à votre rythme

La seconde migration est le passage au vocabulaire propre de ce composant, et elle est facultative, fichier par fichier : l’interface de votant de Security devient celle-ci, #[IsGranted] devient #[AccessPolicy] et ses combinateurs, les noms d’algorithmes de Security deviennent ceux de XACML, les règles d’URL et la hiérarchie de rôles changent de clé, et un jeton en guise de demandeur devient n’importe quoi.

Il n’y a pas de date butoir. Une base de code à mi-chemin fonctionne, parce que les deux vocabulaires atteignent les mêmes votants.

La destination

Une application qui n’a plus du tout Symfony Security, et qui exprime encore tout ce qu’elle exprimait.

Ce n’est pas une expérience de pensée : c’est une forme testée. Chaque pièce est vérifiée sous trois configurations, et c’est la troisième qui trouve ce qui manque.

  • SecurityBundle seul : le comportement de référence, celui auquel les réponses sont comparées.
  • Les deux bundles : la migration est sans couture, même configuration, un bundle de plus, mêmes réponses.
  • Ce bundle seul : la destination est atteignable, sans pare-feu, sans jeton et sans fournisseur d’utilisateurs.

Le contrôleur et le gabarit ne sont jamais écrits deux fois pour les deux piles. Qu’ils ne changent pas est l’affirmation que l’on teste.

Par quoi commencer

  • Installez le bundle et ne changez rien d’autre.
  • Ouvrez une page avec le profileur et vérifiez que l’onglet Configuration dit que le composant répond.
  • Lancez votre suite de tests. Elle devrait être verte, et si elle ne l’est pas, la différence est un bogue qui mérite d’être signalé.
  • Ensuite, et seulement si vous en avez envie, commencez à déplacer vos votants.

Ce qui ne bougera pas tout seul

Deux choses lèvent plutôt que de se dégrader en silence, et il vaut mieux le savoir avant d’installer :

  • L’ACL au niveau du champ dans les gabarits, is_granted('EDIT', post, 'title'), est refusée à voix haute. Une application qui l’emploie ne peut pas installer le bundle.
  • La même chose déclarée sur les deux clés : deux algorithmes de combinaison, deux hiérarchies de rôles, deux jeux de règles d’URL, des valeurs contradictoires d’allow_if_all_abstain. Toutes lèvent à la compilation.

Les deux sont délibérées, et les deux figurent dans les divergences connues, la page à lire avant de décider plutôt qu’après.