Symfony 8.2 Nouveauté Publié le

Des rôles par famille, avec des jokers

ROLE_BLOG_* : une clé de role_hierarchy couvre toute une famille de rôles, y compris ceux qui ne sont déclarés nulle part.

Notions abordées : SecurityRôles

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.

D'où vient la fonctionnalité : la pull request d'origine.