Backend проверяет роль перед каждым действием. Без роли — `403 forbidden_role` с сообщением о требуемой роли. Frontend дополнительно скрывает кнопки, для которых нет роли.
> **Maker side** (создание / submit / withdraw draft'а) специальной ролью не gated — любой authenticated user с required scope может создать draft. Backend защищает invariant maker-checker через `403 self_approve_forbidden` (один и тот же user не может approve свой draft).
## Полная матрица действий
| Действие | Endpoint | Scope требуется | Workflow роль требуется |
|---|---|---|---|
| Просмотр PUBLIC dict | `GET /api/v1/dictionaries` | public+ | — |
Видит публичные справочники, не может ничего менять.
### Maker (контент-редактор)
-`ordinis:client:internal` (видит данные своей области)
Создаёт и редактирует справочники, записи, schema drafts, submit'ит их на ревью. **Не может** approve / publish свои собственные действия (maker-checker).
### Reviewer
-`ordinis:client:restricted`
-`ordinis:schema:reviewer`
-`ordinis:record:reviewer`
Может всё что maker, плюс approve / reject чужих drafts. Publish — отдельной ролью.
### Publisher
-`ordinis:client:restricted`
-`ordinis:schema:reviewer` (опционально)
-`ordinis:schema:publisher`
Финальный gatekeeper для production публикации схем. Обычно более узкая группа чем reviewers.
### Admin (полный доступ)
-`ordinis:client:restricted`
-`ordinis:schema:reviewer`
-`ordinis:schema:publisher`
-`ordinis:record:reviewer`
Или **composite role**`ordinis:admin`, которая агрегирует все четыре.
3. Должна быть `ordinis:schema:reviewer` (для schema) или `ordinis:record:reviewer` (для record).
Если роли нет — назначить в Keycloak и сделать logout/login.
### «403 forbidden_role» от backend
Backend вернул 403 с кодом `forbidden_role`. Сообщение содержит требуемую роль. Назначь её в Keycloak и refresh JWT.
### «403 self_approve_forbidden»
Пользователь пытается approve свой собственный draft. Это **invariant maker-checker** — backend защищает от self-approve. Нужен другой reviewer.
### «404 / пустая страница на /webhooks»
Webhook subscriptions требуют `internal` или `restricted` scope. Назначь `ordinis:client:internal` минимум.
## История
- **Phase 1a/1b/1c** (до 2026-05-12) — backend гейтил только maker-checker, любой authenticated мог review.
- **Phase 1d** (2026-05-13) — backend проверяет workflow роли; frontend скрывает кнопки. Migration require: создать роли в Keycloak и assign actual reviewer-users до или одновременно с deploy.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.