Cómo implementar suspensión de cuentas en Laravel
— laravel, php, autenticación, ban, suspender, middleware — 3 minutos de lectura

La suspensión de cuentas es una funcionalidad común en aplicaciones web que te permite restringir el acceso a los usuarios de forma permanente o temporal. Laravel ofrece herramientas flexibles para lograr esto utilizando campos en la base de datos, middleware y tareas programadas. En esta guía aprenderás cómo implementar ambos tipos de suspensiones.
Suspensión Permanente
Un usuario suspendido permanentemente no podrá acceder a la aplicación hasta que sea reactivado manualmente.
1. Agregar un Campo de Suspensión a la Tabla de Usuarios
Para registrar si un usuario está suspendido, agrega una columna llamada banned_at
en la tabla users
:
1Schema::table('users', function (Blueprint $table) {2 $table->timestamp('banned_at')->nullable();3});
2. Actualizar el Modelo de Usuario
Agrega un método en el modelo User
para verificar si un usuario está suspendido:
1class User extends Authenticatable2{3 // Determina si el usuario está suspendido4 public function isBanned(): bool5 {6 return !is_null($this->banned_at);7 }8}
3. Crear Middleware para Restringir Acceso a Usuarios Suspendidos
Este middleware bloqueará el acceso a cualquier usuario marcado como suspendido:
1public function handle(Request $request, Closure $next)2{3 if (auth()->check() && auth()->user()->isBanned()) {4 abort(403, 'Tu cuenta ha sido suspendida.');5 }6
7 return $next($request);8}
4. Métodos para Suspender y Reactivar Usuarios
Implementa funciones en un controlador para gestionar las suspensiones:
1// Suspende un usuario permanentemente2public function ban(User $user)3{4 $user->update([5 'banned_at' => now(),6 ]);7
8 return response()->json(['message' => 'Usuario suspendido exitosamente.']);9}10
11// Reactiva un usuario previamente suspendido12public function unban(User $user)13{14 $user->update([15 'banned_at' => null,16 ]);17
18 return response()->json(['message' => 'Usuario reactivado exitosamente.']);19}
Suspensión Temporal
En este caso, los usuarios son suspendidos por un período específico y se reactivan automáticamente al finalizar ese tiempo.
1. Modificar la Tabla de Usuarios
Agrega un campo llamado banned_until
para almacenar la fecha de expiración de la suspensión:
1Schema::table('users', function (Blueprint $table) {2 $table->timestamp('banned_until')->nullable();3});
2. Actualizar el Modelo de Usuario
Modifica el método isBanned()
para comprobar si la suspensión sigue activa:
1class User extends Authenticatable2{3 // Verifica si el usuario tiene una suspensión activa4 public function isBanned(): bool5 {6 return !is_null($this->banned_until) && now()->lessThan($this->banned_until);7 }8}
3. Middleware para Restringir Acceso a Usuarios Suspendidos Temporalmente
El middleware sigue siendo similar, pero ahora verifica el campo banned_until
:
1public function handle(Request $request, Closure $next)2{3 if (auth()->check() && auth()->user()->isBanned()) {4 abort(403, 'Tu cuenta está suspendida temporalmente.');5 }6
7 return $next($request);8}
4. Métodos para Suspender y Reactivar Usuarios Temporalmente
Establece una fecha futura para las suspensiones temporales:
1// Suspende un usuario durante 5 días2public function temporaryBan(User $user)3{4 $user->update([5 'banned_until' => now()->addDays(5),6 ]);7
8 return response()->json(['message' => 'Usuario suspendido por 5 días.']);9}10
11// Reactiva un usuario antes de tiempo12public function liftBan(User $user)13{14 $user->update([15 'banned_until' => null,16 ]);17
18 return response()->json(['message' => 'Suspensión levantada exitosamente.']);19}
5. Automatizar la Reactivación con Tareas Programadas
Crea un comando Artisan para eliminar las suspensiones caducadas y configúralo en el scheduler.
Comando para Levantar Suspensiones Caducadas
1namespace App\Console\Commands;2
3use App\Models\User;4use Illuminate\Console\Command;5use Illuminate\Support\Carbon;6
7class LiftExpiredBans extends Command8{9 protected $signature = 'ban:lift';10 protected $description = 'Levanta automáticamente las suspensiones caducadas';11
12 public function handle()13 {14 User::whereNotNull('banned_until')15 ->where('banned_until', '<=', Carbon::now())16 ->update([17 'banned_until' => null,18 ]);19 }20}
Configuración del Scheduler
Programa el comando para ejecutarse cada hora añadiendo la siguiente línea en el archivo app/Console/Kernel.php
:
1$schedule->command('ban:lift')->hourly();
Conclusión
En esta guía aprendiste a implementar suspensiones permanentes y temporales en Laravel mediante:
- Campos en la base de datos (
banned_at
obanned_until
). - Middleware para restringir el acceso a usuarios suspendidos.
- Métodos en controladores para gestionar las suspensiones.
- Un comando programado para levantar suspensiones automáticamente.
Con estos pasos podrás gestionar eficazmente el acceso de los usuarios y asegurarte de cumplir con las políticas de tu aplicación.