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 для зручнішого керування:
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));
Перед дозволом дії перевірте, чи користувач не має активного prohibition:
if ($user->isProhibitedFrom('send message')) {
return response()->json(['error' => 'You are currently restricted from sending messages.'], 403);
}
Щоб застосування обмежень було послідовним по всьому додатку, додайте перевірку 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.
Хочете забезпечити повну прозорість у своїх Laravel-додатках? Пакет Laravel Audit Log допоможе вам детально відстежувати всі зміни моделей Eloquent та відповідати вимогам регуляторів. Читайте далі, щоб дізнатися, як цей потужний інструмент може підвищити надійність вашого проєкту
Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті
Чи стикалися ви з помилкою «SQLSTATE[HY000] [2002] Connection refused» під час налаштування GitHub Actions для вашого додатку на Laravel? У нашій статті ми розглянемо три поширені причини цієї помилки та надамо рішення для їх усунення. Читайте далі, щоб дізнатися, як ваш CI/CD потік може працювати бездоганно!