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?").
Ejemplo:Imaginar que solo el autor de un artículo puede editarlo.

// 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.
Definir el Gate en el proveedor de servicios de autenticación..

// 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