Скасування облікового запису — це поширена вимога у веб-додатках, що дозволяє обмежити доступ користувачів як постійно, так і тимчасово. Laravel пропонує гнучкі механізми для реалізації цієї функції за допомогою полів бази даних, проміжного програмного забезпечення та запланованих завдань. У цьому посібнику розглядаються як постійне, так і тимчасове скасування.
Користувач, у якого обліковий запис постійно скасовано, не може отримати доступ до додатку, допоки його обліковий запис не буде вручну відновлений.
Щоб відстежувати, чи користувача скасовано, додайте стовпець suspended_at
до таблиці users
:
Schema::table('users', function (Blueprint $table) {
$table->timestamp('suspended_at')->nullable();
});
Додайте метод у модель User
, щоб перевіряти, чи користувач скасований:
class User extends Authenticatable
{
public function suspended(): bool
{
return !is_null($this->suspended_at);
}
}
Для блокування доступу скасованим користувачам створіть проміжне програмне забезпечення CheckSuspended:
public function handle(Request $request, Closure $next)
{
if (auth()->check() && auth()->user()->suspended()) {
abort(403, 'Ваш обліковий запис скасовано.');
}
return $next($request);
}
Реалізуйте методи у контролері для скасування та відновлення користувачів:
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
, щоб дозволити автоматичне відновлення.
Додайте стовпець suspended_until
:
Schema::table('users', function (Blueprint $table) {
$table->timestamp('suspended_until')->nullable();
});
Змініть метод suspended()
, щоб перевіряти, чи скасування ще активне:
class User extends Authenticatable
{
public function suspended(): bool
{
return !is_null($this->suspended_until) && Carbon::now()->lessThan($this->suspended_until);
}
}
Цей код залишається тим же, але тепер перевіряє поле suspended_until
:
public function handle(Request $request, Closure $next)
{
if (auth()->check() && auth()->user()->suspended()) {
abort(403, 'Ваш обліковий запис скасовано.');
}
return $next($request);
}
Встановіть майбутню часову мітку для тимчасових скасувань:
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' => 'Користувача успішно відновлено.']);
}
Оскільки тимчасові скасування закінчуються автоматично, ми можемо використовувати заплановане завдання для зняття закінчених скасувань:
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
).Дотримуючи ці кроки, ви зможете ефективно управляти доступом користувачів і забезпечити дотримання політик вашого додатку