Diferencia entre revisiones de «Usuario:ManuelRomero/Laravel/Roles»

De WikiEducator
Saltar a: navegación, buscar
Línea 32: Línea 32:
 
3.- Activamos el sistema de autenticación de laravel con <br />
 
3.- Activamos el sistema de autenticación de laravel con <br />
  
Ahora agregamos o instalamos el paquete en nuestro proyecto
+
*Ahora agregamos o instalamos el paquete en nuestro proyecto
 
<source lang=bash>
 
<source lang=bash>
 
   composer require spatie/laravel-permission
 
   composer require spatie/laravel-permission
Línea 168: Línea 168:
 
<source lang=bash>
 
<source lang=bash>
 
  php artisan db:seed  
 
  php artisan db:seed  
 +
</source>
 +
===Asignando roles a un usuario===
 +
*En el modelo especificamos que vamos a usar roles especificando que vamos a usar  '''''HasRoles'''''
 +
<source lang=php>
 +
class User extends Authenticatable
 +
{
 +
//....
 +
 +
    use HasRoles;
 +
 +
//...
 +
}
 
</source>
 
</source>

Revisión de 20:39 29 may 2022

Qué es un sistema de roles

  • Es una utilidad que suelen tener muchas aplicaciónes donde hay diferentes secciones en nuestro sistema
  • Es algo muy típico y muy bien implementado en los csm, que básicamente consiste es que:

1.- Te identificas en el sistema
2.- En fucnión de tus credenciales puedes realizar determinadas acciones en el sistema
3.- Se identifican roles y a cada rol se le asignan determinadas acciones (dar de alta usuarios, subir noticias, modificar clientes ...)
4.- A los diferentes usuarios se les asisigna un rol concreto, con lo que puede realizar las acciones que a ese rol se le han atribuído
5.- Lo mismo puedo asignar directamente permisos concretos, pero es mucho más útil asigar un rol concreto a un determinado usuario en lugar de dar permiso a permiso

Paquetes para gestionar roles en Laravel

  • Vamos a utilizar el paquete laravel-permission para gestionar estas acciones en nuestro poryecto



https://www.youtube.com/watch?v=r5Zs9CGB754


}}

  • Lo primero que necesitamos es tener una aplicación desarrollada.
  • Vamos a realizar una donde tengamos el siguiente esquema.
  • Por supuesto en nuestra aplicación el usuario se tiene que autentificar para acceder
  • En nuestra aplicación vamos a gestionar Facturas y Clientes pudiendo un cliente tener varias facturas y pudiendo ser una factura de hasta 6 clientes. Por otro lado gestionamos Empleados e Idiomas que habla cada empleado, siendo éste un atributo multivaluado que mostramos en tabla
Modelo relacional roles.png

1.- Crear modelos, crontroladores, migraciones, seeder y factory y resources para cada elemento
2.- Creemos el crud de, por ejemplos las facturas
3.- Activamos el sistema de autenticación de laravel con

  • Ahora agregamos o instalamos el paquete en nuestro proyecto
  composer require spatie/laravel-permission
  • Para que autocomplete en phpstorm los métodos
https://spatie.be/docs/laravel-permission/v3/advanced-usage/phpstorm
  • Una vez que tenemos creada la aplicación vamos a realizar los roles y permisos

Creamos un seeder para poblar los roles y permisos

php artisan make:seed RoleSeeder

Seguimos el post arriba indicado

  • Registramos el proveedor de servicios añadiendolo en el fichero config/app.php
'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];
  • Publicamos la migración y el fichero de configuración de 'permission config/permission.php:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
  • Borramos si lo tuviéramos cacheada la cofiguracioń de los ficheros, habría que borrarla para que la vuelva a cargar


 php artisan optimize:clear
 # or
 php artisan config:clear
  • Ejecutamos las migraciones
php artisan migrate
  • Observamos que ha creado las siguientes tablas

Modelo relacional permission.png

  • Tenemos roles y permisos. Cada rol tendrá asociado permisos (uno o varios) y a su vez, cada permiso tendrá asociado roles (1 o varios), por eso la tabla role_has_permissions.

Tanto los permisos, como los roles, se asocia a modelos (tablas model_has_roles, model_has_permissons). cada perm


  • Instalamos el paquete por composer
  • Incluimos todos los recursos asociados al paquete que acabamos de instalr
  • Creamos las tablas con las migraciones creadas
  1. role_has_permissions
  2. model_has_roles
  3. model_has_permissions
  4. roles
  5. permissions
  • La siguiente imagen muestra las tablas relacionadas
Modelo relacional spite roles.png


  • Este paquete implementa un trait HasRoles (https://diego.com.es/traits-en-php) el cual hay que incorporar a la tabla User, ya que se pretende dar a cada usuario permisos específicos o grupo de permisos (roles)
...
use Spatie\Permission\Traits\HasRoles;
 
class User extends Authenticatable
{
    use Notifiable, HasRoles;
 
    ...
}

Creando Roles y Permisos

  • Ahora tendremos que crear los roles y permisos, según necesitemos en nuestra aplicación
  • Como hemos comentado un Rol, puede tener asociado uno o varios permisos, cada uno de los cuales puede estar asociado a uno o varios roles.
  • Vamos a crear 3 roles para nuestro ejemplo:
  1. Alumno
  2. Profesor
  3. Administrador
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
 
$role = Role::create(['name' => 'alumno']);
$role = Role::create(['name' => 'administrador']);
$role = Role::create(['name' => 'profesor']);
 
$permission = Permission::create(['name' => 'edit articles']);
  • Este código lo tendremos que ejecutar cuando queramos creare el roll, en un controlador. Pero muchas veces, la creación de roles, no será algo dinámico en nuestra aplicación, otras veces sí.
  • Suponemos que queremos tener creados estos tres roles, y ya no se van a crear más. Para ello lo mejor es crear un seeder que alimente la tabla de roles con estos valores.
  • Creamos el seeder, si previamente ya lo hemos creado lo usamos
php artisan make:seeder CreaRoles
  • Editamos el fichero que se ha creado database/seeders/RoleSeeder.php
    public function run()
    {
        $roles  =["administrador","profesor", "alulmno"];
        foreach ($roles as $role) {
            Role::create(["name"=>$role]);
        }
        //
    }
  • Y para ejecutarlo modificamos el método Run de la clase DatabaseSeeder.php
   public function run()
   {
       $roles  =["administrador","profesor", "alulmno"];
       foreach ($roles as $role) {
           Role::create(["name"=>$role]);
       }
       //
   }
    public function run()
    {
        $this->call([
            RoleSeeder::class
        ]);
    }
  • Ahora ya podemos ejectuarlo
 php artisan db:seed

Asignando roles a un usuario

  • En el modelo especificamos que vamos a usar roles especificando que vamos a usar HasRoles
class User extends Authenticatable
{
//....
 
    use HasRoles;
 
//...
}