Ir al contenido
PHP Argentina 🐘

Cómo implementar suspensión de cuentas en Laravel

laravel, php, autenticación, ban, suspender, middleware3 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 🐘.