Saltar al contenido principal

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 auth para 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.