Skip to main content

Diferencia entre autenticación y autorización

La autenticación confirma «quién es» un usuario. El inicio de sesión es su ejemplo más habitual. La autorización determina «qué puede hacer» ese usuario. Por ejemplo, permitir que solo edite sus propios posts o que únicamente los administradores modifiquen los ajustes. Una vez que hayas implementado el inicio de sesión mediante autenticación, el siguiente paso es la autorización.
Las funciones de autorización de Laravel ofrecen dos enfoques: gates y policies. Cuál usar depende de tu caso de uso.
Criterios para decidir

Gates

Los gates son comprobaciones sencillas basadas en closures. Son idóneos para permisos que no están ligados a un modelo concreto.

Flujo de autorización con gates

Definir un gate

Los gates se definen en el método boot de App\Providers\AppServiceProvider con Gate::define().
La closure de un gate recibe siempre como primer argumento el usuario autenticado actualmente. A partir del segundo argumento puedes pasar el modelo objetivo u otros datos.

Comprobar permisos con gates

Para comprobar permisos desde un controlador utiliza Gate::allows() o Gate::denies().

Lanzar una excepción con Gate::authorize()

Para devolver automáticamente una respuesta 403 cuando el usuario no tiene permiso, utiliza Gate::authorize(). Así te ahorras escribir abort(403).
Gate::authorize() lanza Illuminate\Auth\Access\AuthorizationException cuando el usuario no tiene permiso. Laravel la convierte automáticamente en una respuesta HTTP 403.

Bypass para administradores (método before)

Si quieres conceder todos los permisos a los usuarios administradores, utiliza Gate::before().
Si la closure de before devuelve un valor distinto de null, ese valor pasa a ser la decisión definitiva. Si devuelve null o no devuelve nada, se continúa con la comprobación habitual del gate.

@can y @cannot en las plantillas Blade

Las directivas @can y @cannot son muy útiles para comprobar gates en las plantillas.

Policies

Las policies agrupan la lógica de autorización relativa a un modelo concreto en una clase. Para gestionar los permisos de creación, lectura, edición y borrado sobre el modelo Post, las policies son más adecuadas que los gates.

Flujo de autorización con policies

Generar una policy

Genera una clase de policy con el comando Artisan make:policy.
Para generar una plantilla con todos los métodos CRUD asociados a un modelo, utiliza la opción --model.
Se creará app/Policies/PostPolicy.php.

Detección automática de modelos y policies

Laravel detecta las policies automáticamente siguiendo la convención de nombres.
  • Modelo: app/Models/Post.php
  • Policy: app/Policies/PostPolicy.php
Si respetas esta convención no necesitas registrar manualmente la policy.
Si no sigues la convención de nombres o prefieres registrarla manualmente, utiliza Gate::policy() en el método boot de AppServiceProvider.
En Laravel 13 también puedes registrarla de forma declarativa añadiendo el atributo #[UsePolicy] al modelo.

Implementar los métodos de la policy

Las policies generadas con la opción --model incluyen métodos para las acciones CRUD estándar.

Bypass para administradores (método before)

En las policies también puedes definir un método before para conceder todos los permisos a los administradores.
El método before solo se ejecuta si existe el método correspondiente en la clase de la policy. Por ejemplo, si no está definido update, tampoco se invocará before.

Orden de ejecución del callback before

Usar policies en el controlador

Método authorize()

Los controladores de Laravel disponen de un helper authorize() (si no usas el controlador base, utiliza Gate::authorize()).

Registrar policies RESTful con authorizeResource()

Llamando a authorizeResource() en el constructor, cada acción del controlador queda asociada automáticamente al método correspondiente de la policy.
Correspondencia entre acciones del controlador y métodos de la policy:
Con authorizeResource() ya no necesitas llamar a authorize() en cada acción. Resulta especialmente práctico con los resource controllers RESTful.

Autorización en middleware

Para autorizar a nivel de ruta utiliza el middleware can.
Una sintaxis más concisa mediante el método can:

Usar policies en plantillas Blade

Cuando la policy está registrada, las directivas @can y @cannot la utilizan automáticamente.

Ejemplo práctico: permisos de los posts de un blog

Ejemplo de implementación en una aplicación de blog donde «solo el autor puede editar y borrar sus posts».
1

Generar la policy

2

Implementar los métodos de la policy

3

Añadir authorizeResource() al controlador

4

Añadir comprobaciones de permisos a la plantilla Blade

Resumen

  • Gates: comprobaciones simples que no están asociadas a un modelo. Acceso al panel de administración, permisos globales, etc.
  • Policies: gestión de permisos CRUD sobre modelos. Crea una policy por recurso (Post, Order, Comment, etc.).
Última modificación el 13 de julio de 2026