Gérer ses permissions avec laravel-permission

Découverte de paquets
Par Marc COLLET

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 Authenticatable
5{
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.