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']);
}

 

Aquí he hecho una recopilación de los casos de uso básicos donde podrías llegar a utilizar estas funciones. Si quieres ahondar más en la configuración te recomiendo revisar la documentación oficial en el repositorio oficial de la librería: https://github.com/spatie/laravel-permission.
* Para la versión 5.5+ el package Discovery se encarga de enlistar la librería como un proveedor, si estás utilizando una versión anterior debes registrar la librería como proveedor manualmente, para ello sigue las indicaciones de la documentación oficial.
Si tienes alguna duda o aclaración por favor escribela en los comentarios.

Leave a Reply