Roles

Gestión de roles


Spatie Laravel Permission

El paquete spatie/laravel-permission permite gestionar roles y permisos fácilmente en Laravel.
Se integra con el sistema de autenticación estándar, por lo que puedes asignar y comprobar el rol de cualquier usuario autenticado.


Instalación

1
composer require spatie/laravel-permission

Publica la configuración y migraciones:

1
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

Ejecuta las migraciones:

1
php artisan migrate

Esto creará las tablas necesarias:

  • roles
  • permissions
  • model_has_roles
  • model_has_permissions
  • role_has_permissions

️ Configuración inicial

En el modelo User.php añade el trait:

1
2
3
4
5
6
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
use HasRoles;
}

Si tu modelo autenticable es Student (en lugar de User), añade el mismo use HasRoles; allí.


Crear roles

Puedes crear roles desde el seeder, Tinker o directamente en código:

1
2
3
4
5
6
use Spatie\Permission\Models\Role;

// Crear roles
Role::create(['name' => 'student']);
Role::create(['name' => 'teacher']);
Role::create(['name' => 'admin']);

También puedes hacerlo desde un seeder:

1
php artisan make:seeder RolesTableSeeder

Y dentro de él:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;

class RolesTableSeeder extends Seeder
{
public function run(): void
{
Role::firstOrCreate(['name' => 'student']);
Role::firstOrCreate(['name' => 'teacher']);
Role::firstOrCreate(['name' => 'admin']);
}
}

Ejecuta el seeder:

1
php artisan db:seed --class=RolesTableSeeder

Asignar un rol a un usuario

Cuando registras un usuario o estudiante, puedes asignarle un rol inmediatamente:

1
2
3
4
5
6
7
$user = User::create([
'name' => 'Manuel',
'email' => 'manuel@example.com',
'password' => Hash::make('12345678'),
]);

$user->assignRole('student');

También puedes hacerlo dinámicamente:

1
auth()->user()->assignRole('teacher');

Obtener y comprobar roles

Obtener todos los roles del usuario autenticado:

1
$roles = auth()->user()->getRoleNames();

Si el usuario solo tiene un rol, puedes obtener el primero:

1
$rol = auth()->user()->getRoleNames()->first();

Comprobar si el usuario tiene un rol específico:

1
2
3
if (auth()->user()->hasRole('teacher')) {
// Mostrar contenido solo para profesores
}

Comprobar si tiene alguno de varios roles:

1
2
3
if (auth()->user()->hasAnyRole(['admin', 'teacher'])) {
// Acceso especial
}

️ Usar roles en vistas (Blade)

@role('admin')
<p>Panel de administración</p>
@endrole

@hasrole('teacher')
<p>Zona del profesor</p>
@endhasrole

También puedes usar directivas condicionales:

@hasanyrole('admin|teacher')
<p>Bienvenido profesor o administrador</p>
@endhasanyrole

Resumen final

Acción Ejemplo
Instalar paquete composer require spatie/laravel-permission
Publicar y migrar php artisan vendor:publish ... && php artisan migrate
Añadir HasRoles al modelo use HasRoles;
Crear roles Role::create(['name' => 'student']);
Asignar rol a usuario $user->assignRole('student');
Comprobar rol auth()->user()->hasRole('admin');
Obtener rol actual auth()->user()->getRoleNames()->first();
Usuarios con un rol User::role("admin")->get();