Як обмежити дії користувача за допомогою time-based sanctions у Laravel Prohibitions

1
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 21 березня, 2026
Laravel Prohibitions дозволяє тимчасово забороняти конкретні дії користувачів (наприклад, відправлення повідомлень) шляхом збереження обмежень у базі даних без змін у коді. Дізнайтеся, як створювати заборони й санкції, застосовувати їх з терміном дії та інтегрувати з Gates і Policies для централізованої авторизації.

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 — це дає змогу логувати модерацію або повідомляти користувачів:

Події можна вимкнути в конфігурації, якщо вони не потрібні.

Щоб дізнатися більше та переглянути код, відвідайте репозиторій на GitHub.

Популярні

Logomark Logotype

Створення MCP-серверів на PHP

Модельний контекстний протокол (MCP) відкриває нові горизонти в інтеграції AI-додатків з PHP. Дізнайтеся, як легко створити сервер, що відповідає MCP, та які можливості відкриваються для вашого проєкту

Logomark Logotype

Журнал аудиту в Laravel

Хочете забезпечити повну прозорість у своїх Laravel-додатках? Пакет Laravel Audit Log допоможе вам детально відстежувати всі зміни моделей Eloquent та відповідати вимогам регуляторів. Читайте далі, щоб дізнатися, як цей потужний інструмент може підвищити надійність вашого проєкту

Logomark Logotype

Intervention Image: потужний інструмент для роботи з зображеннями у Laravel

Досліджуйте потужний пакет Intervention Image для PHP, який виводить редагування зображень на новий рівень з оновленою версією 3. Чи готові ви дізнатися, які нові можливості та функції чекають на вас у цьому інструменті