RBAC (Role-Based Access Control) - права видаються ролям, а ролі - користувачам.
editor → posts.create, posts.update, posts.publish
viewer → posts.view
Оля → editor
- просто пояснити, просто адмініструвати («зробити Іру редактором»);
- у Laravel -
spatie/laravel-permission, власні таблиці ролей і прав; - слабкість: погано виражає правила «залежно від об'єкта». «Редактор може редагувати лише статті свого відділу» - уже не чиста роль. Спроби втиснути це в RBAC породжують «вибух ролей» (
editor-marketing,editor-sales, ...).
ABAC (Attribute-Based Access Control) - рішення на основі атрибутів користувача, ресурсу, дії й контексту:
public function update(User $user, Document $document): bool
{
return $user->department_id === $document->department_id
&& $document->status !== 'archived'
&& $user->clearance >= $document->classification;
}
- гнучко: відділ, статус документа, рівень доступу, час, IP, країна;
- політики Laravel - це фактично ABAC у коді;
- слабкість: правила розкидані в коді, їх важче перевірити й пояснити («чому Оля бачить цей документ?»).
ReBAC (Relationship-Based Access Control) - доступ визначається зв'язками між об'єктами:
Оля - учасник команди «Маркетинг»
«Маркетинг» - власник папки «Кампанії 2026»
Документ - у папці «Кампанії 2026»
⇒ Оля може переглядати документ
- природно для спільного доступу: Google Drive, GitHub (організації, команди, репозиторії), Notion;
- модель Google Zanzibar і її реалізації (OpenFGA, SpiceDB) масштабують такі перевірки на мільярди зв'язків;
- слабкість: окрема інфраструктура, складність налагодження ланцюжків зв'язків.
На практиці - комбінація:
- RBAC для грубих можливостей («хто має доступ до адмінки», «хто може запрошувати учасників»);
- ABAC / перевірки в політиках для правил щодо конкретних об'єктів («автор може редагувати свою статтю, поки вона не опублікована»);
- ReBAC - коли продукт будується навколо спільного доступу з вкладеними групами й успадкуванням прав.
Головне - не модель, а дисципліна: усі перевірки в одному шарі (політики), кожна дія має правило, і є тести на заборону.