Laravel's Gates and Policies — ключові механізми авторизації. А якщо потрібно тимчасово заблокувати конкретного користувача — наприклад, заборонити надсилати повідомлення на тиждень після перевищення порогу спаму? Laravel Prohibitions від Kyrch зберігає обмеження з терміном дії в базі і дозволяє застосовувати та знімати їх динамічно, без змін у коді.
Пакет підходить для модерації контенту, примусового обмеження швидкості запитів, тимчасових блокувань акаунтів та відключення функцій під час розслідувань. Він розрізняє індивідуальні prohibitions (обмеження однієї дії) і sanctions (групи prohibitions, що застосовуються разом).
# Встановлення
Встановіть пакет через Composer:
composer require kyrch/laravel-prohibitions
Опублікуйте міграції й виконайте їх:
php artisan vendor:publish --tag="laravel-prohibitions-migrations"
php artisan migrate
За потреби опублікуйте файл конфігурації:
php artisan vendor:publish --tag="laravel-prohibitions-config"
# Налаштування моделей
Додайте трейт HasSanctions до моделі, яку можна піддавати обмеженням:
use Kyrch\Prohibition\Traits\HasSanctions;
class User extends Authenticatable
{
use HasSanctions;
}
# Створення prohibitions та sanctions
Prohibitions — окремі дії, які можна обмежити. Sanctions групують кілька prohibitions для зручнішого керування:
use Kyrch\Prohibition\Models\Prohibition;
use Kyrch\Prohibition\Models\Sanction;
// Create individual prohibitions
$sendMessage = Prohibition::query()->create(['name' => 'send message']);
$createComment = Prohibition::query()->create(['name' => 'create comment']);
$joinGroup = Prohibition::query()->create(['name' => 'join group']);
// Group prohibitions into a sanction
$communitySanction = Sanction::query()->create(['name' => 'community restriction']);
$communitySanction->prohibitions()->attach([$sendMessage->id, $createComment->id, $joinGroup->id]);
# Застосування обмежень
Застосуйте одиничну prohibition з датою завершення:
// Prohibit a user from sending messages for one week
$user->prohibit('send message', now()->addWeek());
Застосуйте sanction, щоб одночасно обмежити кілька дій:
// Apply the grouped community sanction for two weeks
$user->applySanction('community restriction', now()->addWeeks(2));
# Перевірка статусу prohibitions
Перед дозволом дії перевірте, чи користувач не має активного prohibition:
if ($user->isProhibitedFrom('send message')) {
return response()->json(['error' => 'You are currently restricted from sending messages.'], 403);
}
# Інтеграція з Laravel Authorization
Щоб застосування обмежень було послідовним по всьому додатку, додайте перевірку prohibition у Gate::before():
use App\Models\User;
use Illuminate\Support\Facades\Gate;
Gate::before(function (User $user, string $ability) {
if ($user->isProhibitedFrom($ability)) {
return false;
}
});
Або додайте перевірки в окремі методи policy:
namespace App\Policies;
use App\Models\Conversation;
use App\Models\User;
class MessagePolicy
{
public function before(User $user, string $ability): ?bool
{
if ($user->isProhibitedFrom($ability)) {
return false;
}
return null;
}
public function send(User $user, Conversation $conversation): bool
{
return $conversation->participants->contains($user);
}
}
# Обробка подій
Пакет генерує події при застосуванні prohibitions і sanctions — це дає змогу логувати модерацію або повідомляти користувачів:
ModelProhibitionTriggered— fired when a prohibition is appliedModelSanctionTriggered— fired when a sanction is applied
Події можна вимкнути в конфігурації, якщо вони не потрібні.
Щоб дізнатися більше та переглянути код, відвідайте репозиторій на GitHub.