Скасування облікового запису — це поширена вимога у веб-додатках, що дозволяє обмежити доступ користувачів як постійно, так і тимчасово. 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 за допомогою:
- Стовпців бази даних (
suspended_atабоsuspended_until). - Проміжного програмного забезпечення для обмеження доступу.
- Методів контролера для управління скасуваннями.
- Запланованого завдання для автоматичного зняття скасувань.
Дотримуючи ці кроки, ви зможете ефективно управляти доступом користувачів і забезпечити дотримання політик вашого додатку