Implementando Suspensão de Conta no Laravel

A suspensão de conta é um requisito comum em aplicações web para restringir o acesso do usuário de forma permanente ou temporária. O Laravel oferece uma maneira flexível de implementar esse recurso usando campos de banco de dados, middleware e tarefas agendadas. Este guia aborda suspensões permanentes e temporárias.
Suspensão Permanente
Um usuário permanentemente suspenso fica impedido de acessar o aplicativo até que seja reativado manualmente.
1. Adicione um campo de suspensão à tabela de usuários
Para rastrear se um usuário está suspenso, adicione uma
suspended_at
coluna à
users
tabela:
Schema::table('users', function (Blueprint $table) { $table->timestamp('suspended_at')->nullable();});
2. Atualize o modelo de usuário
Defina um método no
User
modelo para verificar se o usuário está suspenso:
class User extends Authenticatable{ public function suspended(): bool { return !is_null($this->suspended_at); }}
3. Middleware para restringir usuários suspensos
Para bloquear o acesso de usuários suspensos, crie um middleware CheckSuspended:
public function handle(Request $request, Closure $next) { if (auth()->check() && auth()->user()->suspended()) { abort(403, 'Your account is suspended.'); } return $next($request);}
4. Suspender e reativar usuários
Implementar funções em um controlador para suspender e reativar usuários:
public function suspend(User $user){ $user->update([ 'suspended_at' => Carbon::now(), ]); return response()->json(['message' => 'User suspended successfully.']); } public function unsuspend(User $user) { $user->update([ 'suspended_at' => null, ]); return response()->json(['message' => 'User unsuspended successfully.']);}
Suspensão temporária
Para suspensões temporárias, armazenamos um
suspended_until
registro de data e hora em vez de
suspended_at
para permitir a reativação automática.
1. Modifique a tabela de usuários
Adicione uma
suspended_until
coluna:
Schema::table('users', function (Blueprint $table) { $table->timestamp('suspended_until')->nullable();});
2. Atualize o modelo de usuário
Modifique o
suspended()
método para verificar se a suspensão ainda está ativa:
class User extends Authenticatable{ public function suspended(): bool { return !is_null($this->suspended_until) && Carbon::now()->lessThan($this->suspended_until); }}
3. Middleware para restringir usuários suspensos
É o mesmo de antes, mas agora verifica o
suspended_until
campo:
public function handle(Request $request, Closure $next){ if (auth()->check() && auth()->user()->suspended()) { abort(403, 'Your account is suspended.'); } return $next($request);}
4. Suspender e reativar usuários temporariamente
Defina um registro de data e hora futuro para suspensões temporárias:
public function suspend(User $user){ $user->update([ 'suspended_until' => Carbon::now()->addDays(7), ]); return response()->json(['message' => 'User suspended for 7 days.']); } public function unsuspend(User $user){ $user->update([ 'suspended_until' => null, ]); return response()->json(['message' => 'User unsuspended successfully.']);}
5. Cancelar a suspensão automática de usuários por meio do Agendador
Como as suspensões temporárias expiram automaticamente, podemos usar uma tarefa agendada para suspender suspensões expiradas:
namespace App\Console\Commands; use App\Models\User;use Illuminate\Console\Command;use Illuminate\Support\Carbon; class SuspendClear extends Command{ /** * The name and signature of the console command. */ protected $signature = 'suspend:clear'; /** * The console command description. */ protected $description = 'Automatically lift expired suspensions'; /** * Execute the console command. */ public function handle() { User::whereNotNull('suspended_until') ->where('suspended_until', '<=', Carbon::now()) ->update([ 'suspended_until' => null, ]); }}
Adicione este
suspend:clear
comando ao agendador para ser executado de hora em hora, dentro do
routes/console.php
arquivo:
/** * php artisan schedule:work */Schedule::command('suspend:clear')->hourly();
Conclusão
Este guia demonstra como implementar suspensões de contas permanentes e temporárias no Laravel usando:
-
Colunas de banco de dados (
suspended_at
oususpended_until
). - Middleware para restringir acesso.
- Métodos de controle para gerenciamento de suspensões.
- Uma tarefa agendada para levantar suspensões automaticamente.
Ao integrar essas etapas, você pode gerenciar efetivamente o acesso dos usuários e garantir a conformidade com as políticas do seu aplicativo.