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.
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étodoboot de App\Providers\AppServiceProvider con Gate::define().
Comprobar permisos con gates
Para comprobar permisos desde un controlador utilizaGate::allows() o Gate::denies().
Lanzar una excepción con Gate::authorize()
Para devolver automáticamente una respuesta 403 cuando el usuario no tiene permiso, utilizaGate::authorize(). Así te ahorras escribir abort(403).
Bypass para administradores (método before)
Si quieres conceder todos los permisos a los usuarios administradores, utiliza Gate::before().
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 modeloPost, 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 Artisanmake:policy.
--model.
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 no sigues la convención de nombres o prefieres registrarla manualmente, utiliza En Laravel 13 también puedes registrarla de forma declarativa añadiendo el atributo
Gate::policy() en el método boot de AppServiceProvider.#[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.
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()).
- User::can() / cannot()
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.
Autorización en middleware
Para autorizar a nivel de ruta utiliza el middlewarecan.
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
Cuándo usar gates y cuándo policies
Cuándo usar gates y cuándo policies
- 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.).
APIs más habituales
APIs más habituales
Comandos Artisan habituales
Comandos Artisan habituales