- Instalación: Agrega el paquete a tu proyecto Laravel con Composer.
composer require spatie/laravel-permission
- Publicación: Copia la configuración y migración al proyecto mediante un comando Artisan.
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
- Configuración: Si estás usando laravel-permission, encontrarás el archivo de configuración en config/permission.php, donde podrás personalizar cosas como el nombre de las tablas o el comportamiento de la asignación de permisos.
- Migración: después de que se hayan publicado y configurado la migración y la configuración, puede crear las tablas para este paquete ejecutando:
php artisan migrate
- Añadir Spatie\Permission\Traits\HasRoles al modelo User.
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
// ...
}
- Creación de Roles y Permisos: Cada rol está asociado con múltiples permisos. A Role y a Permission son modelos Eloquent regulares. Requieren a name y se pueden crear así:
use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; Permission::create(['name' => 'formulario registro']); Permission::create(['name' => 'lista candidatos']); $roleSuperAdmin = Role::create(['name' => 'super-admin']);
- Sincronizar Permisos (Roles): Solo se conservarán los permisos que están en la lista. Si el rol tiene permisos que no están en la lista, esos permisos se eliminarán.
//Obtiene todos los permisos y los asigna a la variable
$permissionsSuperAdmin = Permission::query()->pluck('name');
//Sincronizar todos los permisos a un rol
$roleSuperAdmin->syncPermissions($permissionsSuperAdmin);
//Sincronizar un permiso en específico a un rol
$roleSuperAdmin->syncPermissions('formulario registro');
Asignar Permiso (Roles): Otorga un permiso específico a un rol sin eliminar los existentes.
$roleSuperAdmin->givePermissionTo('formulario registro');
- Revocar Permiso (Roles): Elimina un permiso particular de un rol.
$roleSuperAdmin->revokePermissionTo(‘formulario registro’);
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
//Permisos de los usuarios
Permission::create(['name' => 'formulario registro']);
Permission::create(['name' => 'lista candidatos']);
Permission::create(['name' => 'dashboard']);
//Roles de los usuarios
$roleSuperAdmin = Role::create(['name' => 'super-admin']);
$roleAdmin = Role::create(['name' => 'admin']);
$roleCandidato = Role::create(['name' => 'candidato']);
//Asignar permisos a los roles
$permissionsSuperAdmin = Permission::query()->pluck('name');
$permissionsAdmin = Permission::query()->pluck('name');
$roleSuperAdmin->syncPermissions($permissionsSuperAdmin);
$roleAdmin->syncPermissions($permissionsAdmin);
$roleCandidato->syncPermissions('formulario registro');
//Crear usuario y asignar rol
$superAdmin = User::create([
'name' => 'Super Admin',
'email' => 'sistemas@test.mx',
'password' => '123456789',
'email_verified_at' => now()
]);
$superAdmin->assignRole($roleSuperAdmin);
$admin = User::create([
'name' => 'Admin',
'email' => 'admin@test.mx',
'password' => '123456789',
'email_verified_at' => now()
]);
$admin->assignRole($roleAdmin);
$candidato = User::create([
'name' => 'Candidato',
'email' => 'candidato@test.mx',
'password' => '123456789',
'email_verified_at' => now()
]);
$candidato->assignRole($roleCandidato);
}
}
- Asignar Rol (Usuarios): Vincula un rol definido a un usuario.
$superAdmin = User::create([ 'name' => 'Super Admin', 'email' => 'sistemas@ieebc.mx', 'password' => '123456789', 'email_verified_at' => now() ]); $superAdmin->assignRole($roleSuperAdmin);
$roleSuperAdmin es una instancia del modelo Role que se asigna al usuario $superAdmin, en la tabla roles tenemos
1 super-admin, 2 admin, 3 candidato y en la tabla model_has_roles tenemos role_id y model_id donde model_id corresponde al usuario y role_id al rol asignado. La función assignRole() está definida en el Traits\HasRoles del modelo user por lo que incorpora múltiples funciones.
- Directivas Blade: Spatie también ofrece directivas de Blade para controlar la visualización de contenido basado en roles y permisos.
@role('super-admin')
<x-nav-link :href="route('listado')" :active="request()->routeIs('listado')">
{{ __('Lista de personas Candidatas') }}
</x-nav-link>
@endrole
@can('lista candidatos')
<x-nav-link :href="route('listado')" :active="request()->routeIs('listado')">
{{ __('Lista de personas Candidatas') }}
</x-nav-link>
@endcan
- Middleware de Spatie: Registrar sus alias para facilitar su referencia en otras partes de su aplicación, en app/Http/Kernel.php en el array $middlewareAliases.
protected $middlewareAliases = [ 'role' => \Spatie\Permission\Middleware\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class, ];
- Middleware en Rutas: Muestra cómo permitir acceso a un grupo de rutas a usuarios que tengan el rol de ‘admin’, ‘candidato’ o ‘super-admin’:
Route::middleware([‘role:admin|candidato|super-admin’])->group(function () { .. });
- Middleware en Controladores: Para proteger a los controladores.
public function __construct()
{
// Solo los usuarios con el rol 'candidato' podrán acceder al método 'update'
$this->middleware('role:candidato')->only('update');
}
Obtener todos los roles del usuario
$roles = $user->getRoleNames(); // Retorna una colección de strings
foreach ($roles as $rol) {
echo $rol;
}