馃攽Autorizaci贸n avanzada con Policies y Gates

 

馃攽 Autorizaci贸n avanzada con Policies y Gates

 
   

Controlando el acceso a acciones y modelos

   

      En Laravel, la **Autenticaci贸n** verifica qui茅n es el usuario (login), mientras que la **Autorizaci贸n** determina lo que el usuario puede hacer. Aunque vimos los roles b谩sicos, la autorizaci贸n avanzada a nivel de aplicaci贸n (ej. "¿Puede este usuario editar *este* post?") se maneja de forma elegante con **Policies** y **Gates**. Estas herramientas son fundamentales para mantener una aplicaci贸n segura y con permisos escalables.    

 
    
   

馃毆 Gates (Puertas)

   

      Los **Gates** son la forma m谩s simple de definir reglas de autorizaci贸n. Son funciones de *closure* o de *callback* que definen una capacidad espec铆fica, t铆picamente usada para permisos que no est谩n ligados a un modelo de Eloquent (ej. "acceder al panel de administraci贸n").    

   

Ejemplo Visual: Gate para 'es-admin'

   

      Los Gates se definen en el archivo **`App\Providers\AuthServiceProvider.php`**.    

   
     
        Definici贸n de Gate (AuthServiceProvider.php)              
     
// Dentro del m茅todo boot()
Gate::define('es-admin', function ($user) {
    return $user->rol === 'administrador';
});
   
   

      Luego se verifica el Gate en cualquier parte de tu c贸digo:    

   
     
        Uso del Gate              
     
// En un Controlador o Vista:
if (Gate::allows('es-admin')) {
    // El usuario es administrador
}

// En Blade:
@can('es-admin')
    Panel de Administraci贸n
@endcan
   
 
 
   

馃洝️ Policies (Pol铆ticas): Autorizaci贸n basada en Modelos

   

      Las **Policies** son clases que organizan la l贸gica de autorizaci贸n para un modelo espec铆fico (ej. **`PostPolicy`** para el modelo **`Post`**). Son la herramienta recomendada por Laravel para la mayor铆a de las verificaciones de permisos relacionadas con Eloquent.    

   

Creaci贸n y Estructura de una Policy

   

      Puedes crear una Policy con Artisan:    

   
     
        Comando Artisan              
     
php artisan make:policy PostPolicy --model=Post
   
   

      Esta clase contendr谩 m茅todos como `viewAny`, `view`, `create`, `update`, `delete`, etc.    

 
 
   

✍️ Ejemplo de Uso de Policy: Editar un Post

   

      Definiremos una regla simple: un usuario solo puede editar su propio post.    

   

Definici贸n de la Policy (`PostPolicy.php`)

   
     
        M茅todo update en PostPolicy              
     
public function update(User $user, Post $post): bool
{
    // Retorna true si el ID del usuario actual es igual
    // al ID del usuario que cre贸 el post.
    return $user->id === $post->user_id;
}
   
   

      **Uso en el Controlador:** Usamos el m茅todo `authorize()` para delegar la verificaci贸n a la Policy. Si falla, Laravel autom谩ticamente lanza una excepci贸n 403.    

   
     
        Uso en un Controlador              
     
public function edit(Post $post)
{
    // Verifica si el usuario actual (Auth::user()) puede 'update' este $post.
    $this->authorize('update', $post);

    return view('posts.edit', compact('post'));
}
   
 
    
   

馃‍馃捇 Resumen: ¿Cu谩ndo usar cada uno?

   
         
  • **Gates:** Usar para permisos generales, de alto nivel, que no est谩n ligados a una instancia de modelo espec铆fica (ej. `acceder-dashboard`, `ver-reportes-generales`).
  •      
  • **Policies:** Usar para la mayor铆a de las acciones CRUD (**C**rear, **R**eer, **U**pdate, **D**elete) que afectan a un modelo Eloquent (ej. `editar(Post $post)`, `borrar(Comment $comment)`).
  •    
 
 

Publicar un comentario

0 Comentarios