Ролі та права доступу
DocPlatform використовує контроль доступу на основі ролей (RBAC) на базі вбудованого авторизаційного рушія, що працює в процесі. Перевірка прав доступу виконується менш ніж за 0,1 мс без зовнішнього сервісу.
Ієрархія ролей
DocPlatform визначає 5 ролей у строгій ієрархії. Вищі ролі успадковують усі права нижчих ролей.
Super Admin ← Повний доступ до платформи (усі робочі простори)
│
Admin ← Управління налаштуваннями робочого простору, учасниками, git, темою
│
Editor ← Створення та редагування сторінок (налаштовується для кожного workspace)
│
Commenter ← Перегляд сторінок, залишення коментарів
│
Viewer ← Лише перегляд сторінок
Platform Owner — внутрішня роль для операторів самостійно розгорнутих екземплярів, призначена для обслуговування платформи (міграції бази даних, управління ліцензіями, конфігурація системи). Вона не відображається в інтерфейсі чи API і не входить до публічної ієрархії ролей.
Матриця прав доступу
| Дозвіл | Viewer | Commenter | Editor | Admin | Super Admin |
|---|---|---|---|---|---|
| Перегляд сторінок | Так | Так | Так | Так | Так |
| Пошук контенту | Так | Так | Так | Так | Так |
| Залишати коментарі | Так | Так | Так | Так | |
| Редагування сторінок | Так | Так | Так | ||
| Створення сторінок | Налаштовується | Так | Так | ||
| Видалення сторінок | Налаштовується | Так | Так | ||
| Завантаження ресурсів | Так | Так | Так | ||
| Призначення учасників org до робочого простору | Так | Так | |||
| Видалення учасників робочого простору | Так | Так | |||
| Зміна ролей учасників (в межах робочого простору) | Так | Так | |||
| Управління налаштуваннями робочого простору | Так | Так | |||
| Управління темою та навігацією | Так | Так | |||
| Запрошення зовнішніх користувачів до org | Так | ||||
| Створення/видалення робочих просторів | Так | ||||
| Налаштування git remote | Так | ||||
| Управління білінгом та підпискою | Так | ||||
| Доступ до всіх робочих просторів | Так | ||||
| Управління налаштуваннями org | Так |
Налаштовувані права редактора
Можливості Editor можна налаштувати для кожного робочого простору. Admin та Super Admin конфігурують їх в налаштуваннях робочого простору:
| Параметр | За замовчуванням | Опис |
|---|---|---|
editor_can_create_pages |
true |
Редактори можуть створювати нові сторінки |
editor_can_delete_pages |
false |
Редактори можуть видаляти сторінки |
API:
curl -X PATCH http://localhost:3000/api/v1/workspaces/:id \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"editor_can_create_pages": true,
"editor_can_delete_pages": false
}'
Конфігураційний файл:
# .docplatform/config.yaml (для робочого простору)
permissions:
editor_can_create_pages: true
editor_can_delete_pages: false
Коли дозвіл вимкнено, редактори бачать дію неактивною в інтерфейсі та отримують 403 Forbidden від API.
Призначення ролей
Перший користувач (Super Admin)
Перший зареєстрований користувач на новому екземплярі DocPlatform автоматично отримує роль Super Admin. Це відбувається лише один раз — наступні реєстрації не отримують ролі в робочому просторі, доки їх не запросять.
Super Admin є власником org та створювачем акаунту. Він має повний контроль над кожним робочим простором, білінгом, git-підключеннями та запрошенням зовнішніх користувачів.
Запрошення зовнішніх користувачів
Лише Super Admin може запрошувати зовнішніх користувачів до організації:
Веб-інтерфейс: Org Settings → Members → Invite External User
API:
curl -X POST http://localhost:3000/api/v1/org/invitations \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"default_role": "editor"
}'
Запрошений користувач приєднується до org і може бути призначений до робочих просторів будь-яким Admin або Super Admin.
Призначення учасників до робочих просторів
Admin призначає існуючих учасників org до свого робочого простору. Admin не може запрошувати зовнішніх користувачів — це може робити лише Super Admin.
Веб-інтерфейс: Workspace Settings → Members → Add Member → оберіть з учасників org → оберіть роль
API:
curl -X POST http://localhost:3000/api/v1/workspaces/:id/members \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"user_id": "01HY5K3M7Q8P",
"role": "editor"
}'
Роль за замовчуванням
Встановіть роль за замовчуванням для нових учасників, доданих до робочого простору без конкретної ролі:
# .docplatform/config.yaml
permissions:
default_role: viewer
Доступні значення: viewer, commenter, editor, admin
Контроль доступу на рівні сторінок
Перевизначте права доступу на рівні робочого простору для окремих сторінок за допомогою frontmatter. Правила доступу frontmatter обмежують в межах ролі користувача — вони ніколи не надають прав понад роль.
Синтаксис контролю доступу
Використовуйте правила доступу на основі ролей та користувачів для контролю доступу до сторінки:
---
title: Internal Security Policy
access:
roles: ["security-team", "engineering-leads"]
users: ["@01HY5K3M7Q8P"]
---
| Поле | Тип значення | Опис |
|---|---|---|
access.roles |
список назв ролей | Ролі, що мають доступ до цієї сторінки |
access.users |
список @user_id |
Окремі користувачі, що мають доступ до цієї сторінки |
Правила:
- Ідентифікатори користувачів позначаються префіксом
@ - Super Admin та Admin завжди мають доступ незалежно від правил frontmatter
- Frontmatter може лише обмежувати — сторінка не може надати доступ понад роль користувача в робочому просторі
Що означає обмежений доступ
Коли сторінка має правила access:
- Користувачі без необхідної ролі не можуть переглядати сторінку
- Сторінка не з’являється в результатах пошуку для неавторизованих користувачів
- Прямий доступ за URL повертає 403 Forbidden
Доступ до опублікованої документації
Для опублікованого документаційного сайту (/p/{slug}/...) контроль доступу працює інакше:
- Усі опубліковані сторінки є публічними за замовчуванням — вхід не потрібен
- Щоб вимагати вхід для всього опублікованого сайту, встановіть
PUBLISH_REQUIRE_AUTH=true— це застосовується до всіх сторінок у всіх робочих просторах - Контроль доступу на рівні окремих сторінок в опублікованій документації заплановано для майбутнього релізу
У v0.5 поле frontmatter
accessзберігається та доступне для майбутнього використання, але не застосовується на опублікованих маршрутах. ВикористовуйтеPUBLISH_REQUIRE_AUTHдля обмеження доступу на рівні всього сайту.
Внутрішні рівні ролей
Для довідки, кожна роль відповідає числовому рівню. Вищі рівні успадковують усі права нижчих рівнів:
| Роль | Рівень | Область | Мінімальна дія |
|---|---|---|---|
| Viewer | 10 | Workspace | read |
| Commenter | 20 | Workspace | read, comment |
| Editor | 30 | Workspace | read, comment, edit (+ create/delete якщо увімкнено) |
| Admin | 40 | Workspace | Усі дії у workspace |
| Super Admin | — | Org | Обходить усі перевірки workspace |
Внутрішній код використовує
workspace_adminдля Admin таsuper_adminдля Super Admin. Це деталі реалізації — публічні назви: Admin та Super Admin.
Дії мають мінімальні рівні: read вимагає рівень 10+, write вимагає 30+, delete вимагає 30+ (та editor_can_delete_pages увімкнено для Editor), admin вимагає 40+. Рівень ролі користувача порівнюється з мінімальним рівнем дії.
Як оцінюються права доступу
API Request
│
▼
Auth Middleware
(extract JWT, identify user)
│
▼
Permission Middleware
(custom RBAC check: user + role + resource + action)
│
├── Allowed → proceed to handler
│
└── Denied → 403 Forbidden
5-крокова послідовність оцінки
- Чи є користувач Platform Owner? → ДОЗВОЛИТИ (глобальний обхід)
- Чи є користувач Org Super Admin для організації цього workspace? → ДОЗВОЛИТИ (обхід на рівні організації)
- Знайти роль користувача у workspace → якщо не учасник, ВІДМОВИТИ
- Чи досягає рівень ролі мінімуму для дії? → порівняти
role_level >= action_min_level, плюс прапорці прав редактора - Чи має сторінка правила доступу у frontmatter? → перевірити
access.roles/access.users, ОБМЕЖИТИ в межах ролі
Frontmatter ОБМЕЖУЄ в межах ролі, ніколи не НАДАЄ понад неї. Некоректний frontmatter за замовчуванням використовує строгий режим — сторінка обмежена лише для Admin.
Продуктивність
| Метрика | Значення |
|---|---|
| Рушій | custom RBAC (у процесі, у пам’яті) |
| Час оцінки | < 0,1 мс на перевірку |
| Пакетна перевірка | < 1 мс на 100 сторінок |
| Кеш | Версіонований (автоматично інвалідується при зміні ролі або прав) |
| Зберігання політик | SQLite (завантажується в пам’ять при старті) |
Кешування прав доступу
Політики custom RBAC завантажуються з SQLite у пам’ять при запуску сервера. Зміни ролей або frontmatter декларацій доступу запускають інвалідацію кешу:
- Admin змінює роль користувача → версія кешу прав інкрементується
- Editor оновлює frontmatter сторінки з новими правилами
access→ кеш інвалідується для цієї сторінки - Наступна перевірка прав завантажує свіжу політику з SQLite
Кеш версіонований, а не часовий — вікна застарілих прав немає.
Плани та ліміти місць
Підрахунок місць
Ролі Super Admin, Admin та Editor враховуються у ліміті max_editors плану. Ролі Commenter та Viewer необмежені на всіх планах і ніколи не враховуються.
Коли ліміт місць досягнуто, нових учасників org все ще можна запрошувати — але їм можна призначити лише ролі Commenter або Viewer, доки місце не звільниться.
Community Edition
Community Edition безкоштовний та self-hosted, ліцензійний ключ не потрібен:
| Ресурс | Ліміт |
|---|---|
| Робочі простори | Необмежено |
| Editors (Super Admin + Admin + Editor) | Необмежено |
| Viewers та Commenters | Необмежено |
| Сторінки | Необмежено |
Cloud плани
| Free | Team | Business | |
|---|---|---|---|
| Робочі простори | 1 | 3 | 10 |
| Місця (Super Admin + Admin + Editor) | 3 | 15 | 50 |
| Viewers & Commenters | Необмежено | Необмежено | Необмежено |
| Сторінки | 50 | 150 | 500 |
Потрібно більше? Зв’яжіться з відділом продажів для Enterprise планів з користувацькими лімітами, SSO та SLA.
Типові шаблони
Публічна документація з обмеженими внутрішніми сторінками
# Більшість сторінок: без правил доступу (відкриті для всіх учасників)
# Внутрішні сторінки: обмежені
---
title: Incident Response Playbook
access:
roles: ["sre-team", "admin"]
---
Редактор створює, адміністратор публікує
- Встановіть
publishing.default_published: falseв конфігурації робочого простору - Editors створюють та редагують сторінки (неопубліковані за замовчуванням)
- Admins переглядають та перемикають
published: true
Робочі простори для окремих команд
Створіть окремі робочі простори для кожної команди з незалежними списками учасників:
- Робочий простір
eng-docs→ інженерна команда - Робочий простір
product-docs→ продуктова команда - Робочий простір
internal-wiki→ усі
Super Admin має доступ до всіх робочих просторів для міжкомандної видимості. Admin управляє учасниками в межах призначених робочих просторів.
Обмеження можливостей Editor
Для робочих просторів, де Editors мають лише змінювати існуючий контент:
# .docplatform/config.yaml
permissions:
editor_can_create_pages: false
editor_can_delete_pages: false
Editors можуть редагувати існуючі сторінки, але не можуть створювати нові або видаляти будь-які.
Усунення несправностей
«403 Forbidden» на сторінці, до якої я маю мати доступ
- Перевірте свою роль: Profile → Workspace Membership
- Перевірте frontmatter сторінки: чи включає
access.rolesвашу роль? - Попросіть Admin робочого простору перевірити призначення вашої ролі
- Якщо ви Editor, перевірте чи дія вимагає увімкнення
editor_can_create_pagesабоeditor_can_delete_pages
Зміни прав не набувають чинності
Зміни прав мають бути миттєвими (інвалідація кешу синхронна). Якщо це не так:
- Вийдіть та увійдіть знову (оновіть JWT токени)
- Перевірте логи сервера на предмет помилок інвалідації кешу
- Запустіть
docplatform doctorдля перевірки стану системи прав
Перший користувач не є Super Admin
Це трапляється, якщо перший користувач реєструється, коли база даних уже містить записи користувачів (наприклад, від попереднього встановлення). Для виправлення:
- Зупиніть сервер
- Видаліть базу даних:
rm {DATA_DIR}/data.db - Запустіть сервер та зареєструйтесь знову
Це скидає всі дані. Використовуйте лише на свіжих інсталяціях.
«Ліміт місць досягнуто» при запрошенні учасника
Ліміт max_editors плану досягнуто. Варіанти:
- Понизити існуючого Admin або Editor до Commenter або Viewer, щоб звільнити місце
- Запросити нового користувача як Commenter або Viewer (необмежені)
- Оновити план для отримання більшої кількості місць