Ir al contenido
PHP Argentina 🐘

Cómo implementar suspensión de cuentas en Laravel

— laravel, php, autenticación, ban, suspender, middleware — 3 minutos de lectura

You are banned

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 Authenticatable
2{
3 // Determina si el usuario está suspendido
4 public function isBanned(): bool
5 {
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 permanentemente
2public 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 suspendido
12public 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 Authenticatable
2{
3 // Verifica si el usuario tiene una suspensión activa
4 public function isBanned(): bool
5 {
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ías
2public 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 tiempo
12public 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 Command
8{
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 o banned_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.

© 2025 por PHP Argentina 🐘.