DEV Community

Cover image for Simplifier la gestion des permissions avec le Pattern Decorator en PHP et Symfony
TechniveK
TechniveK

Posted on • Edited on

Simplifier la gestion des permissions avec le Pattern Decorator en PHP et Symfony

Gérer les permissions dans une application peut vite devenir compliqué, surtout quand tu dois ajouter des couches d’autorisations supplémentaires au fil du temps. Plutôt que d’avoir une classe géante qui gère tous les types d’autorisations possibles, le Pattern Decorator te permet d’ajouter ou modifier dynamiquement les permissions en empilant des décorateurs. Intéressant non ?

Pourquoi le Pattern Decorator ?

Le Pattern Decorator permet d'enrichir un objet avec de nouvelles fonctionnalités sans modifier sa structure de base. Dans le cas de la gestion des permissions, il te permet d’ajouter des règles ou des couches d’autorisation au fur et à mesure que tu en as besoin. Et le gros avantage, c’est que tu n’as pas à modifier ton code existant à chaque fois que tu ajoutes une nouvelle règle.

En gros, tu peux partir d’un objet simple et lui « coller » des fonctionnalités au fur et à mesure que tu en as besoin. Tu ne me crois toujours pas ? Check la suite !

Exemple concret : Gestion des permissions utilisateur

Disons que ton application doit gérer différents types d'utilisateurs (admin, éditeur, lecteur). Chaque utilisateur a des permissions différentes : un admin peut tout faire, un éditeur peut modifier du contenu, et un lecteur ne peut que consulter.

Plutôt que d'enfermer ces règles dans une énorme classe conditionnelle, on va utiliser le Pattern Decorator pour gérer les permissions d'accès dynamiquement.

Étape 1 : L'interface de base

On va commencer par définir une interface PermissionInterface qui représente le concept de "permission". Chaque permission va offrir la méthode checkAccess(), qui vérifie si l'utilisateur a accès à une ressource spécifique.

PHP PermissionInterface

Étape 2 : La classe de base (utilisateur sans privilèges)

Ensuite, on va créer une classe de base pour un utilisateur avec un accès basique, sans permissions spécifiques.

PHP BasicUser class

Étape 3 : Les décorateurs pour les permissions

Et maintenant, on va créer des décorateurs pour ajouter différentes permissions à notre utilisateur. Par exemple, un décorateur pour un utilisateur avec un accès administrateur :

PHP AdminPermissionDecorator

Tu commences à comprendre le principe... On va créer un autre décorateur pour un éditeur, qui peut seulement modifier du contenu, mais pas tout :

PHP EditorPermissionDecorator

Et enfin, on peut avoir un décorateur pour un utilisateur en mode lecture seule (comme un lecteur) :

PHP ReadOnlyPermissionDecorator

Étape 4 : Utilisation dans Symfony

Il est temps d'utiliser ces magnifiques décorateurs dans un contrôleur Symfony pour gérer les permissions d’un utilisateur en fonction de son rôle.

On va utiliser un cas classique : un utilisateur veut accéder à la page d'édition d'une page (ou d'un article, peu importe). Selon ses permissions (admin, éditeur, etc.), il peut avoir accès ou non à cette page. C'est ici que l'empilement des permissions avec le PatternDecorator va intervenir.

Symfony PageController

  1. Création de l'utilisateur : On commence par un utilisateur basique sans permissions particulières (BasicUser).

  2. Ajout des permissions via les décorateurs : À chaque étape, tu peux "décorer" cet utilisateur en lui ajoutant des permissions.

  3. Empilement des permissions : Chaque décorateur s'ajoute dynamiquement à l'utilisateur, enrichissant ses droits d'accès.
    Au final, le système va vérifier toutes les permissions cumulées via les décorateurs.

Les avantages du Pattern Decorator

  1. Gestion flexible des permissions : Grâce au Pattern Decorator, tu peux facilement ajouter ou retirer des permissions sans toucher au code existant. Si demain tu ajoutes un nouveau type de rôle, il te suffit de créer un nouveau décorateur.

  2. Meilleure séparation des responsabilités : Chaque rôle ou permission est encapsulé dans une classe distincte. Le code est donc plus clair, mieux organisé, et facile à maintenir.

  3. Extension facile : Le jour où tu as besoin d’un rôle supplémentaire (par exemple, un modérateur), tu crées simplement un nouveau décorateur et le reste de ton système de gestion des permissions reste intact.

Mais prudence

Même si ce pattern est très pratique, fais attention à ne pas abuser du nombre de décorateurs. Trop de couches peuvent rendre ton code plus difficile à suivre. Assure-toi que chaque nouvelle permission ajoute vraiment de la valeur et évite de complexifier inutilement ton architecture.

En résumé

Le Pattern Decorator est une solution idéale pour gérer des permissions de façon dynamique dans une application Symfony. En empilant des décorateurs, tu peux ajouter des rôles et des règles d'accès de manière modulaire, tout en gardant ton code propre et facile à maintenir.

Si tu as apprécié cet article, n'hésite pas à me suivre et commenter !

Top comments (2)

Collapse
 
technivek profile image
TechniveK

Salut @lyrixx !

Tu as complètement raison, j'aurais pu utiliser les voters dans cet exemple. C'est effectivement la solution la plus directe pour les besoins liés à la sécurité et aux autorisations dans Symfony.

Cependant, dans cet article, mon but était de montrer comment on peut enrichir dynamiquement un service en ajoutant des couches de comportement sans modifier directement les services existants.

Il est vrai que j'aurais pu choisir un autre exemple que les autorisations d'un utilisateur dans une application 😄 mais tu viens de me donner une idée pour un prochain article : les voters dans Symfony ! 😁

En tout cas, merci pour ton commentaire 🙏

Collapse
 
lyrixx profile image
Grégoire Pineau

Hello

Pourquoi tu n'utilises pas les voters pour simplifier la gestion des règles de sécurité ?