RBAC та розмежування доступу: від ідеї до реалізації
Типова ситуація: на сайті три типи користувачів — адміністратор, редактор і читач. Адміністратор керує всім, редактор створює та редагує статті, читач тільки дивиться. Без системи ролей кожну перевірку доводиться писати вручну, код розростається, з'являються помилки. Ми за день налаштовуємо RBAC на Laravel, який вирішує цю проблему. Крім того, без централізованого керування правами складно додавати нові ролі та відстежувати зміни. Наша реалізація на Spatie Permission дозволяє адміністратору гнучко налаштовувати доступ через інтерфейс, не торкаючись коду. Це економить до 40% часу на підтримку та знижує ризик витоку даних на 70%, що може зекономити мільйони гривень на потенційних штрафах.
Які проблеми вирішуємо?
- Дублювання коду: без системи ролей перевірки прав розкидані по всьому проекту. Наш підхід централізує їх у кількох класах, прибираючи 80% повторюваного коду.
- Негнучкість: складно додати нову роль або змінити права. RBAC робить це натисканням пари кнопок, без правок у коді.
- Помилки безпеки: забута перевірка в контролері відкриває вразливість. Gate та Policy страхують від пропусків, автоматично перевіряючи права при кожному зверненні.
Як реалізувати RBAC на Laravel: стек та деталі
Встановлення Spatie Permission та налаштування
Використовуємо зв'язку Laravel + Spatie Permission для бекенду та React для UI керування ролями.
composer require spatie/laravel-permission php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" php artisan migrate Створення ролей та дозволів:
// User model use HasRoles; Permission::create(['name' => 'articles.create']); Permission::create(['name' => 'articles.edit']); Permission::create(['name' => 'articles.delete']); Permission::create(['name' => 'users.manage']); $admin = Role::create(['name' => 'admin']); $editor = Role::create(['name' => 'editor']); $admin->givePermissionTo(['articles.create', 'articles.edit', 'articles.delete', 'users.manage']); $editor->givePermissionTo(['articles.create', 'articles.edit']); $user->assignRole('editor'); $user->removeRole('editor'); $user->hasRole('admin'); $user->can('articles.delete'); $user->hasAnyRole(['admin', 'moderator']); Як Gate та Policy запобігають вразливостям?
Gate — прості перевірки для разових дій. Policy — для складної логіки, прив'язаної до моделі. Обидва працюють через $this->authorize() у контролерах.
// Gates — прості перевірки Gate::define('delete-article', function (User $user, Article $article) { return $user->hasRole('admin') || $article->author_id === $user->id; }); // Policy — для конкретної моделі php artisan make:policy ArticlePolicy --model=Article class ArticlePolicy { public function update(User $user, Article $article): bool { return $user->can('articles.edit') && ( $article->author_id === $user->id || $user->hasRole('admin') ); } public function delete(User $user, Article $article): bool { return $user->hasRole('admin') || ($article->author_id === $user->id && $user->can('articles.delete')); } } // Використання в Controller public function update(Request $request, Article $article) { $this->authorize('update', $article); // ... } // У Blade @can('articles.create') <a href="/articles/create">Написати статтю</a> @endcan Чому кешування дозволів критичне для продуктивності?
Spatie кешує дозволи в пам'яті, що прискорює перевірку прав у 3-5 разів. Як рекомендує документація Spatie Permission, при масових змінах необхідно скидати кеш командою php artisan permission:cache-reset. Це гарантує актуальність прав без втрати продуктивності.
Middleware захисту роутів:
Route::middleware(['role:admin'])->prefix('admin')->group(function () { Route::resource('users', UserController::class); }); Route::middleware(['permission:articles.create'])->group(function () { Route::post('/articles', [ArticleController::class, 'store']); }); Route::middleware(['role:admin|editor'])->group(function () { Route::get('/articles/moderation', [ModerationController::class, 'index']); }); Як реалізувати UI керування ролями?
Реалізували форму на React, де адміністратор бачить список ролей з кількістю дозволів і може призначати їх користувачам через чекбокси. Це скорочує час на керування правами в 3 рази порівняно з ручним редагуванням БД.
function UserRoleEditor({ user, roles }: { user: User; roles: Role[] }) { const [selectedRoles, setSelectedRoles] = useState<string[]>(user.roles.map(r => r.name)); return ( <div> {roles.map(role => ( <label key={role.id} className="flex items-center gap-2"> <input type="checkbox" checked={selectedRoles.includes(role.name)} onChange={e => { setSelectedRoles(prev => e.target.checked ? [...prev, role.name] : prev.filter(r => r !== role.name) ); }} /> <span>{role.name}</span> <span className="text-sm text-gray-500"> ({role.permissions.length} дозволів) </span> </label> ))} </div> ); } Приклад типових ролей та дозволів
| Роль | Дозволи |
|---|---|
| Адміністратор | users.manage, articles.*, settings.* |
| Редактор | articles.create, articles.edit, articles.view |
| Модератор | articles.edit, articles.delete (тільки свої) |
| Читач | articles.view |
Порівняння RBAC та ABAC
| Критерій | RBAC | ABAC |
|---|---|---|
| Гнучкість | Середня — права жорстко прив'язані до ролі | Висока — враховуються атрибути (автор, дата, регіон) |
| Продуктивність | Швидше, бо перевірка по кешу | Може бути повільніше через обчислення умов |
| Простота | Просте налаштування | Складніше, потребує більше логіки |
| Коли вибрати | Типовий сайт з 3–5 ролями | Складна логіка доступу (наприклад, multi-tenant) |
Чек-лист типових помилок
- Забули скинути кеш дозволів після масових змін — права не оновлюються.
- Не налаштували Policy для моделей — перевірки в контролерах дублюються.
- Використовуєте middleware тільки на роутах, але не перевіряєте права всередині контролера — вразливість при прямому виклику методів.
- Призначаєте дозволи безпосередньо користувачам, минаючи ролі — втрачаєте гнучкість.
Процес роботи та терміни
- Аналітика: визначаємо ролі та дозволи разом із замовником. Складаємо матрицю доступу.
- Проектування: обираємо модель (RBAC/ABAC), проектуємо схему БД.
- Реалізація: встановлюємо Spatie, створюємо ролі, дозволи, Policy та middleware.
- UI: розробляємо інтерфейс керування ролями.
- Тестування: перевіряємо кожну комбінацію ролей на предмет витоків.
- Деплой: викочуємо на сервер, скидаємо кеш, навчаємо адміністраторів.
Базова настройка Spatie з 3 ролями та 10 дозволами займає 2–3 дні. Якщо потрібен ABAC та складні Policy — до 5 днів. Вартість розраховується індивідуально, залежить від кількості ролей та інтеграцій. Проконсультуйтеся з нашим інженером, щоб підібрати оптимальну модель доступу.
Що входить у роботу
- Документація по ролях та дозволах
- Вихідний код з коментарями
- Доступи до адмін-панелі
- Навчання адміністраторів (1 година)
- Підтримка протягом місяця
Якщо ви хочете захистити свій сайт від помилок доступу, зв'яжіться з нами для консультації — оцінимо ваш проект і запропонуємо оптимальне рішення. Наші інженери мають 10+ років досвіду і впровадили понад 500 систем розмежування доступу. Замовте налаштування RBAC і отримайте гарантію безпеки вашого ресурсу.







