Nouveau dans Symfony 8.2 (en développement). Une role_hierarchy se lit rôle par rôle : chaque clé est un rôle précis, chaque valeur ce qu'il accorde. Deux sections qui distribuent les mêmes rôles, et la même phrase est écrite deux fois ; une troisième section, et on la réécrit. Symfony 8.2 accepte des clés à joker, qui désignent une famille entière.
Le joker
Le * ne compte comme joker qu'à deux endroits : entouré d'underscores, ou en fin de rôle après un underscore. ROLE_BLOG* et ROLE_*BLOG restent des noms de rôles ordinaires.
security: role_hierarchy: ROLE_*: ROLE_USER ROLE_*_MODERATEUR: ROLE_MODERATEUR ROLE_BLOG_*: ROLE_BLOG_LECTEUR
Un rôle cumule alors ce que lui donnent tous les jokers auxquels il correspond, et sa propre clé s'il en a une. Surtout, un joker vaut aussi pour les rôles qu'on n'a jamais déclarés : ROLE_BLOG_ARCHIVISTE, inventé demain, lit déjà le blog.
Le joker n'existe que du côté des clés. is_granted('ROLE_BLOG_*') cherche toujours un rôle exact, et ne trouvera rien.
Voir ce qui a joué
Deux jokers qui se recoupent, et l'on doute vite de ce qu'un rôle reçoit vraiment. Symfony 8.2 répond dans la console :
php bin/console debug:roles ROLE_BLOG_MODERATEUR --tree
ROLE_BLOG_MODERATEUR ├── ROLE_* │ └── ROLE_USER ├── ROLE_*_MODERATEUR │ └── ROLE_MODERATEUR ├── ROLE_BLOG_* │ └── ROLE_BLOG_LECTEUR ├── ROLE_BLOG_SUPPRIMER_ARTICLE └── ROLE_BLOG_VERROUILLER_ARTICLE
Chaque branche nomme la clé qui a accordé ce qu'elle porte. Sans --tree, la commande donne la liste à plat ; sans argument, toute la hiérarchie.
À faire
La revue a deux sections, le blog et le forum, et leur hiérarchie répète neuf fois ce qui pourrait tenir en quelques lignes. Dans config/packages/security.yaml, réécrivez role_hierarchy avec des jokers, sans rien changer à ce que chacun reçoit — l'aperçu /roles affiche, pour chaque rôle, ses rôles effectifs.
Une fois les jokers en place, ROLE_BLOG_ARCHIVISTE, que la configuration ne mentionne nulle part, doit lire le blog comme les autres.