LARAVEL AUTHORIZATION: ¿POLICIES O GATES?
La seguridad es el corazón de cualquier aplicación profesional. En Laravel, tenemos dos herramientas principales para gestionar quién puede hacer qué: Policies y Gates. Aunque ambas sirven para autorizar, tienen propósitos muy distintos.Laravel Policies
Hay que usar Policy cuando la lógica de permiso dependa de un modelo específico (como un Post, una Factura o un Comentario). Usarla cuando:- Cuando se tienen múltiples acciones para un recurso (crear, ver, editar, borrar).
- Cuando se necesita comparar datos del usuario con datos del modelo (ej. "¿es este el dueño del post?").
// app/Policies/PostPolicy.php
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
//En el controlador
public function edit(Post $post)
{
$this->authorize('update', $post); // Laravel busca automáticamente la PostPolicy
return view('posts.edit', compact('post'));
}
Laravel Gates
Hay que usar Gate para permisos generales que no están atados a un modelo en particular. Son ideales para comprobaciones rápidas de "sí o no". Usarla cuando:- Para acciones globales (ej. "acceder al panel de administración").
- Cuando la lógica es simple y no requiere una clase entera.
// app/Providers/AppServiceProvider.php (o AuthServiceProvider)
public function boot(): void
{
Gate::define('access-admin', function (User $user) {
return $user->hasRole('admin');
});
}
//En la Vista (Blade):
@can('access-admin')
Ir al Panel de Control
@endcan