

En esta tutorial vamos a implementar una de las 2 librerías más utilizadas para el manejo de Roles y Permisos de usuarios con Laravel. Laravel-permission by Spatie.
Esta librería te permite crear roles y permisos, asociar roles a usuarios, asociar permisos con roles así como también a usuarios en particular. Además incluye directivas blade para que puedas usarlas directamente en las vistas, de igual forma también provee grupos de middlewares para permitir/denegar acceso a peticiones realizadas por los mismos usuarios.
-
Instalación
composer require spatie/laravel-permission
-
Implementación en el Modelo User
class User extends Authenticatable { use HasRoles; // ... }
Debemos usar el trait HasRoles sobre el modelo de usuarios que estemos utilizando, si usas el scaffolding auth de Laravel asegurate de registrarlo en App/User.
1.- Asignación de roles y permisos
-
Crear un rol
Role::create(['name' => 'admin']);
-
Asignar un rol a un usuario
$user = User::find(1); $user->assignRole('admin');
Los roles solo pueden ser asignados a usuarios
-
Crear un permiso
Permission::create(['name' => 'universal']);
Los permisos pueden ser asignados a roles o usuarios
-
Asignar un permiso a un rol
$role = Role::find(1); $role->givePermissionTo('universal');
-
Asignar un permiso a un usuario
$user = User::find(2); $user->givePermissionTo('universal');
-
Revocar permiso a un usuario
$user->revokePermissionTo('universal');
-
Revocar rol a un usuario
$user->removeRole('writer');
-
Conocer si el usuario X tiene el rol “admin”
$user->hasRole('admin');
-
Conocer si el usuario X tiene el permiso “universal”
$role->hasPermissionTo("universal");
Además de todas estas acciones básicas también podemos obtener el listado de roles/permisos por usuario, así como usuarios que tienen un rol o un permiso en especifico.
-
Listado de roles que posee el usuario X
$user->getRoleNames();
-
Listado de permisos que posee el usuario X
$user->getAllPermissions();
Este método obtendrá los permisos otorgados directamente así como también los permisos heredados de los roles que este usuario posee.
2.- Uso de directivas Blade para vistas
-
Directiva @role o como validar que el usuario posea el rol especificado
@role('admin') Soy un administrador @else No soy un administrador @endrole
-
Directiva @can o como validar que el usuario posea el permiso especificado
@can('universal') Tengo el permiso universal @endcan
3.- Uso de middleware para validar peticiones
Para poder habilitar estas funciones necesitas agregar los siguientes middlewares al archivo app/Http/Kernel.php:
protected $routeMiddleware = [ // ... 'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, ];
-
Acceder al grupo de rutas solo si posees el rol “admin”
Route::group(['middleware' => ['role:admin']], function () { // });
-
Acceder al grupo de rutas solo si posees el permiso “universal”
Route::group(['middleware' => ['permission:universal']], function () { // });
-
Acceder al grupo de rutas solo si posees el rol “admin” y el permiso “universal”
Route::group(['middleware' => ['role:admin','permission:universal']], function () { // });
O si lo prefieres, también puedes definir este middleware en el constructor de los recursos de la siguiente forma:
public function __construct() { $this->middleware(['role:admin','permission:universal']); }