Реалізація призупинення облікових записів у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 04 квітня, 2025
Ви коли-небудь замислювались, як ефективно управляти доступом користувачів у вашому веб-додатку? У нашій статті ми розглянемо, як реалізувати постійні та тимчасові призупинки облікових записів у Laravel, використовуючи базу даних, middleware та заплановані задачі. Читайте далі, щоб дізнатися про найкращі практики управління доступом!

Скасування облікового запису — це поширена вимога у веб-додатках, що дозволяє обмежити доступ користувачів як постійно, так і тимчасово. Laravel пропонує гнучкі механізми для реалізації цієї функції за допомогою полів бази даних, проміжного програмного забезпечення та запланованих завдань. У цьому посібнику розглядаються як постійне, так і тимчасове скасування.

# Постійне скасування

Користувач, у якого обліковий запис постійно скасовано, не може отримати доступ до додатку, допоки його обліковий запис не буде вручну відновлений.

# 1. Додайте поле скасування до таблиці Users

Щоб відстежувати, чи користувача скасовано, додайте стовпець suspended_at до таблиці users:

Schema::table('users', function (Blueprint $table) {
    $table->timestamp('suspended_at')->nullable();
});

# 2. Оновіть модель User

Додайте метод у модель User, щоб перевіряти, чи користувач скасований:

class User extends Authenticatable
{
    public function suspended(): bool
    {
        return !is_null($this->suspended_at);
    }
}

# 3. Проміжне програмне забезпечення для обмеження доступу скасованих користувачів

Для блокування доступу скасованим користувачам створіть проміжне програмне забезпечення CheckSuspended:

public function handle(Request $request, Closure $next)
{
    if (auth()->check() && auth()->user()->suspended()) {
        abort(403, 'Ваш обліковий запис скасовано.');
    }

    return $next($request);
}

# 4. Скасування та відновлення користувачів

Реалізуйте методи у контролері для скасування та відновлення користувачів:

public function suspend(User $user)
{
    $user->update(['suspended_at' => Carbon::now()]);

    return response()->json(['message' => 'Користувача успішно скасовано.']);
}

public function unsuspend(User $user)
{
    $user->update(['suspended_at' => null]);

    return response()->json(['message' => 'Користувача успішно відновлено.']);
}

# Тимчасове скасування

Для тимчасових скасувань ми зберігаємо часову мітку suspended_until замість suspended_at, щоб дозволити автоматичне відновлення.

# 1. Модифікуйте таблицю Users

Додайте стовпець suspended_until:

Schema::table('users', function (Blueprint $table) {
    $table->timestamp('suspended_until')->nullable();
});

# 2. Оновіть модель User

Змініть метод suspended(), щоб перевіряти, чи скасування ще активне:

class User extends Authenticatable
{
    public function suspended(): bool
    {
        return !is_null($this->suspended_until) && Carbon::now()->lessThan($this->suspended_until);
    }
}

# 3. Проміжне програмне забезпечення для обмеження доступу скасованих користувачів

Цей код залишається тим же, але тепер перевіряє поле suspended_until:

public function handle(Request $request, Closure $next)
{
    if (auth()->check() && auth()->user()->suspended()) {
        abort(403, 'Ваш обліковий запис скасовано.');
    }

    return $next($request);
}

# 4. Тимчасове скасування та відновлення користувачів

Встановіть майбутню часову мітку для тимчасових скасувань:

public function suspend(User $user)
{
    $user->update(['suspended_until' => Carbon::now()->addDays(7)]);

    return response()->json(['message' => 'Користувача скасовано на 7 днів.']);
}

public function unsuspend(User $user)
{
    $user->update(['suspended_until' => null]);

    return response()->json(['message' => 'Користувача успішно відновлено.']);
}

# 5. Автоматичне відновлення користувачів через планувальник

Оскільки тимчасові скасування закінчуються автоматично, ми можемо використовувати заплановане завдання для зняття закінчених скасувань:

namespace App\Console\Commands;

use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;

class SuspendClear extends Command
{
    protected $signature = 'suspend:clear';

    protected $description = 'Автоматично відмінити закінчені скасування';

    public function handle()
    {
        User::whereNotNull('suspended_until')
            ->where('suspended_until', '<=', Carbon::now())
            ->update(['suspended_until' => null]);
    }
}

Додайте команду suspend:clear до планувальника, щоб вона виконувалася щогодини, у файлі routes/console.php:

/**
 * php artisan schedule:work
 */
Schedule::command('suspend:clear')->hourly();

# Висновки

Цей посібник демонструє, як реалізувати постійне та тимчасове скасування облікових записів у Laravel за допомогою:

Дотримуючи ці кроки, ви зможете ефективно управляти доступом користувачів і забезпечити дотримання політик вашого додатку