1. Instalación: Agrega el paquete a tu proyecto Laravel con Composer.
composer require spatie/laravel-permission
  1. Publicación: Copia la configuración y migración al proyecto mediante un comando Artisan.
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
  1. 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.
  1. 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
  1. 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;
// ...
 }
  1. 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']);
  1. 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');
  1. 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);
    }
}
  1. 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.

  1. 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
  1. 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,
     ];
  1. 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 () { .. });

  1. 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;
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *