Autenticación y autorización
Laravel incluye sistemas integrados para autenticación y autorización, lo que permite controlar el acceso a rutas y recursos según la identidad y los permisos de los usuarios. Estas herramientas facilitan implementar seguridad de manera consistente y siguiendo buenas prácticas.
Autenticación
Laravel ofrece scaffolding para autenticación con comandos Artisan y paquetes oficiales como Laravel Breeze o Laravel Jetstream. Esto permite manejar registro, inicio de sesión, recuperación de contraseña y verificación de correo electrónico.
Ejemplo básico de middleware de autenticación en rutas:
Route::middleware('auth')->group(function () {
Route::get('/perfil', function () {
return 'Perfil del usuario autenticado';
});
Route::get('/dashboard', function () {
return 'Panel de administración';
});
});
Autorización
La autorización permite definir qué acciones puede realizar un usuario autenticado. En Laravel, Gates y Policies son los dos mecanismos principales del sistema de autorización, es decir, controlar qué puede hacer cada usuario una vez autenticado.
Ambos sirven para controlar el acceso de forma limpia y desacoplada del resto de la lógica, pero Gates son más simples y generales, mientras que Policies son más estructuradas y orientadas a recursos.
Uso de Gates
Las Gates definen si un usuario puede realizar una acción. Son ideales para lógica de autorización que no está ligada a un modelo específico.
use Illuminate\Support\Facades\Gate;
Gate::define('eliminar-usuario', function ($user, $usuario) {
return $user->rol === 'admin';
});
Route::delete('/usuarios/{id}', function ($id) {
$usuario = Usuario::findOrFail($id);
if (Gate::denies('eliminar-usuario', $usuario)) {
return response()->json(['mensaje' => 'No autorizado'], 403);
}
$usuario->delete();
return response()->json(null, 204);
});
Uso de Policies
Son clases organizadas en torno a un modelo Eloquent. Se usan cuando la lógica de autorización está relacionada con recursos específicos (posts, facturas, usuarios...).
Creación de una policy:
php artisan make:policy UsuarioPolicy --model=Usuario
Ejemplo de método en la policy:
public function eliminar(User $user, Usuario $usuario)
{
return $user->rol === 'admin';
}
En el controlador o ruta:
$this->authorize('eliminar', $usuario);
Buenas prácticas y convenciones
- Separar la autenticación (identificación de usuarios) de la autorización (permisos).
- Usar middleware
authpara proteger rutas. - Implementar policies para la autorización de modelos y acciones específicas.
- Evitar lógica de autorización directa en controladores; delegar a policies o gates.
- Mantener roles y permisos bien definidos y consistentes en toda la aplicación.