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

1
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 22 січня, 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

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

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

Logomark Logotype

Інтеграція Laravel Socialite з бібліотекою Google Client PHP

Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті

Logomark Logotype

"SQLSTATE[HY000] [2002] Connection refused" у Laravel в GitHub Actions

Чи стикалися ви з помилкою «SQLSTATE[HY000] [2002] Connection refused» під час налаштування GitHub Actions для вашого додатку на Laravel? У нашій статті ми розглянемо три поширені причини цієї помилки та надамо рішення для їх усунення. Читайте далі, щоб дізнатися, як ваш CI/CD потік може працювати бездоганно!