Seguridad en Laravel: Spatie/Permission

Permisos Laravel
Solucionex
27
Oct 25

No todos los usuarios deberían ver o hacer lo mismo en tu aplicación. Con el paquete Permission de Spatie podemos controlar roles y permisos de una manera flexible y rápida. En este artículo te mostraré cómo configurar y usar el paquete para que tu aplicación sea más segura.

 

Instalando Spatie/Permission

El primer paso es instalar el paquete oficial de Spatie para Laravel. Recordar que siempre debemos revisar los requisitos de cada paquete, en este caso lo podemos revisar en el siguiente enlace. En nuestra terminal ejecuramos lo siguiente:

composer require spatie/laravel-permission

Una vez lanzado el comando, debemos publicar la migración y el archivo de configuración:

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

Antes de lanzar las migraciones debemos asegurarnos de si estamos usando UUIDs en nuestro proyecto. En nuestro caso, es muy probable que estemos usando UUIDs, por lo que necesitamos hacer un par de ajustes antes de lanzar las migraciones. Si no estás usando UUIDs, puedes saltarte esta sección 🚀.

Configuración para UUID

Necesitamos editar el archivo de la migración create_permission_tables.php desués de haberlo creado con el comando anterior. Por defecto, este cambio tendremos que hacerlo dos veces en el archivo, para ello buscamos lo siguiente:

// Esto es lo que debemos borrar
// $table->unsignedBigInteger($columnNames['model_morph_key']);

// Esto es lo que debemos añadir según el campo de nuestra tabla
$table->uuid('user_id');

Una vez realizado este cambio, limpiamos nuestra caché:

php artisan optimize:clear

Y lanzamos las migraciones:

php artisan migrate

Una vez todo haya sido lanzado con éxito, debemos añadir el trait necesario a nuestro modelo de Usuario:

use HasRoles;

 

Uso básico del paquete

Empezaremos creando un rol de ejemplo y un par de permisos para ese rol. Para crear nuestro rol y permisos debemos hacerlo de la siguiente manera y añadir nombres:

 

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'editor']);
$readPermission = Permission::create(['name' => 'view posts']);
$editPermission = Permission::create(['name' => 'edit posts']);

Y para añadir esos permisos a nuestro rol, debemos hacer lo siguiente:

$role->givePermissionTo($readPermission, $editPermission)

// También podemos hacerlo de la siguiente forma:
$readPermission->syncRoles($role)

Para eliminar un permiso de un rol, bastaría con llamar al metodo revokePermissionTo:

$role->revokePermissionTo($permission);

 

Ahora, necesitamos añadir a nuestro usuario el rol que hemos creado:

$user->assignRole('editor');

Para comprobar que los permisos funcionan, podemos irnos a una sección de nuestra aplicación y hacer lo siguiente:

$user->hasPermissionTo('view posts');

Esto nos devolverá un boolean indicando si el usuario tiene permiso o no.

 

Comprobaciones básicas

Gracias al paquete, podemos hacer varias comprobaciones de roles, permisos, etc. Por ejemplo, si queremos comprobar que el usuario tenga un determinado rol, podemos usar lo siguiente:

$user->hasRole('editor');

Si necesitamos comprobar un conjunto de roles:

$user->hasAnyRole(['editor', 'writer']);

 

Otros usos

También podemos otorgar permisos directamente a un usuario, aunque no es recomendable una vez que tengamos roles. Es preferible asignar roles a los usuarios en lugar de permisos individuales. Aún así, podemos asignar permisos de manera directa a un usuario de la siguiente forma:

$user->givePermissionTo('view posts');

De igual forma, podemos hacer una comprobación directa:

$user->can('view posts');

 

Desde la versión 6 del paquete, se pueden usar Enums para asignar roles y permisos. Puedes descubrir más acerca de los Enums en el siguiente enlace.

 

Conclusión

Gestionar roles y permisos es fundamental para mantener segura nuestra aplicación. Gracias al paquete de Spatie/Permission, este proceso se vuelve más sencillo, ayudándonos a definir roles, asignar permisos y controlar el acceso de los usuarios de una manera clara y eficiente.

 

 

Fuentes

Documentación oficial de Laravel-Permission de Spatie

 

La imagen del artículo ha sido creada con ChatGPT 5.

laravel