Gérer ses permissions avec laravel-permission
Imaginez une application où chaque utilisateur a le pouvoir de faire tout ce qu'il souhaite, sans aucune restriction ; cela pourrait rapidement se transformer en chaos. C'est là qu'interviennent les systèmes de permissions et de rôles.
Cependant; il peut arriver qu’implémenter de tels systèmes puisse être tout autant chaotique au sein du code.
Heureusement spatie/laravel-permission est là pour rendre la tâche plus simple.
Ce paquet a pour objectif de gérer les permissions et les rôles de vos utilisateurs via la base de données.
Voyons ensemble comment cet outil fonctionne.
Installation
Il s’agit d’un paquet, vous pouvez donc simplement utiliser cette commande composer
:
1composer require spatie/laravel-permission
Un fichier config/permission.php
est nécessaire au bon fonctionnement de l’outil. Si vous avez déjà un fichier portant ce nom, vous allez devoir le renommer ou le supprimer.
Publiez la migration et le fichier de configuration config/permission.php
avec :
1php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
Si vous avez mis en cache la configuration localement, videz votre cache avec cette commande :
1php artisan config:clear
Une fois la configuration effectuée, vous pouvez créer les tables en exécutant :
1php artisan migrate
Usage
Tout d’abord, ajoutons le Trait HasRoles à notre modèle User :
1use Illuminate\Foundation\Auth\User as Authenticatable;2use Spatie\Permission\Traits\HasRoles;3 4class User extends Authenticatable5{6 use HasRoles;7 8 // ...9}
Créer une permission
Le paquet permet d'associer des utilisateurs à des permissions et à des rôles. Chaque rôle est associé à plusieurs permissions.
Un rôle et une permission sont des modèles Eloquent ordinaires. Ils nécessitent un nom et peuvent être créés comme suit :
1use Spatie\Permission\Models\Role;2use Spatie\Permission\Models\Permission;3 4$role = Role::create(['name' => 'writer']);5$permission = Permission::create(['name' => 'edit articles']);
Associer une permission à un rôle
Une permission peut être attribuée à un rôle en utilisant l'une ou l'autre de ces méthodes :
1$role->syncPermissions($permissions);2$permission->syncRoles($roles)
Retirer une permission d’un rôle
Une permission peut être retirée d'un rôle en utilisant l'une ou l'autre de ces méthodes :
1$role->revokePermissionTo($permission);2$permission->removeRole($role);
Assigner des permissions et des rôles à un utilisateur
Une fois vos permissions créées et assignées à un rôle vous pouvez les attribuer à un utilisateur comme suit :
1$user->givePermissionTo('edit articles');2$user->assignRole('writer');
Obtenir les permissions d'un utilisateur
Le trait HasRoles ajoute des relations Eloquent à vos modèles, auxquelles vous pouvez accéder directement ou que vous pouvez utiliser comme requête de base.
Pour obtenir une liste de toutes les permissions directement attribuées à un utilisateur :
1$permissionNames = $user->getPermissionNames();2$permissions = $user->permissions;
Pour obtenir toutes les permissions d'un utilisateur, soit directement, soit à partir des rôles, soit à partir des deux :
1$permissions = $user->getDirectPermissions();2$permissions = $user->getPermissionsViaRoles();3$permissions = $user->getAllPermissions();
Pour obtenir le nom des rôles d'un utilisateur :
1$roles = $user->getRoleNames(); // Returns a collection
Utilisation des scopes
Le trait HasRoles fourni à vos modèles deux scopes role
et permission
.
Ils ont pour objectif d’obtenir uniquement les utilisateurs ayant un certain rôle et/ou une certaine permission.
1$users = User::role('writer')->get();2// Returns only users with the role 'writer'3 4$users = User::permission('edit articles')->get();5// Returns only users with the permission 'edit articles' (inherited or directly)
Le scope role
accepte une chaîne de caractères, un modèle Role ou une instance de \Illuminate\Support\Collection
.
De la même manière, permission
accepte une chaîne de caractères, un modèle Permission ou une instance de \Illuminate\Support\Collection
.
Vérifier les permissions d’un utilisateur
Toutes les permissions sont enregistrées au sein de notre framework, vous pouvez donc vérifier si un utilisateur peut effectuer une action avec la fonction can
par défaut de Laravel :
1$user->can('edit articles');
Ainsi que via les Blade directives :
1@can('edit articles')2...3@endcan
Pour aller plus loin
En plus de ces fonctionnalités standards, d’autres outils plus pointus sont à disposition comme par exemple une gestion des permissions par équipe, des middlewares ou encore la possibilité de fonctionner via de multiples guards
Vous pouvez retrouver toutes les informations de ce paquet sur son dépôt Github.
A lire
Autres articles de la même catégorie
La validation d'emails
Décortiquons ensemble la validation des adresses email avec Laravel !
Rémy Guillermic
PHPStan: Un outil qui vous veut du bien
Découverte d’un outil qui analyse finement notre code afin d’y détecter des bugs !
William Suppo
Type-Safe de A à Z
Unifiez les types entre le backend et le frontend pour réduire les bugs et améliorer la cohérence de votre code
Rémy Guillermic