Implementando Suspensão de Conta no Laravel

Laravel PHP Tutoriais
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 ou suspended_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.