馃攽 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)`).
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias