docs(rbac): обновить RBAC sections после Phase 1d + Phase 2

This commit is contained in:
Александр Зимин
2026-05-13 16:41:03 +00:00
parent 0e165f69ca
commit c41e34545b
2 changed files with 49 additions and 8 deletions
+32 -8
View File
@@ -407,14 +407,38 @@ curl -X POST /api/v1/dictionaries/mission/drafts/8f3a.../publish -d '{
| 403 | `maker_only` | submit/withdraw от чужого actor'а |
| 422 | `breaking_change_requires_draft` | inline PATCH вернул это — переходи в workflow |
## RBAC (TBD)
## RBAC
В текущей реализации workflow доступен любому authenticated user'у через
network-level auth policy. Когда Keycloak roles claim прорастёт в JWT,
будут отдельные требования:
Phase 1d (2026-05-13) — backend enforced. Реализация в [`WorkflowRoles`](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/-/blob/main/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/auth/WorkflowRoles.java). Полная матрица — [`docs/operator/rbac.md`](../../operator/rbac.md).
- `dict_schema_maker` — для create / submit / withdraw
- `dict_schema_reviewer` — для decision
- `dict_schema_publisher` — для publish
| Действие | Workflow role |
|---|---|
| create / submit / update / withdraw schema draft | — (maker — любой authenticated с scope ACL) |
| decide (approve / request_changes / reject) | `ordinis:schema:reviewer` |
| publish (approved → live) | `ordinis:schema:publisher` |
| Super-role для всех workflow actions | `ordinis:admin` |
См. record-level `DraftController` для reference architecture pool model.
Naming convention — colon-separated `ordinis:<domain>:<action>`, consistent
со scope ACL (`ordinis:client:public/internal/restricted`).
**Phase 2 (2026-05-13) — per-dict минимальная роль ревьюера.** Поле
`approvalMinRole` на `DictionaryDefinition` (set'ится через
`DictionaryEditorDialog` или import CUOD-bundle манифеста). Если задано —
backend требует чтобы reviewer имел эту роль **дополнительно** к
стандартной `schema:reviewer` / `schema:publisher`. `ordinis:admin`
проходит автоматически. Use case: критичный справочник
(`approvalMinRole = "ordinis:restricted"`) — approve может только user с
restricted-scope role'ю.
**JWT claim path:** на staging/prod — `resource_access.ordinis.roles`
(client-scoped Keycloak roles), default fallback `realm_access.roles`.
Configurable через `ORDINIS_AUTH_ROLES_CLAIM`. `usePermissions.ts` на
frontend читает оба пути.
**Maker-checker invariant:** maker (creator) не может decide свой
собственный draft — 409 `self_approve_forbidden`. Backend rule, не
обходится через admin role.
См. также:
- [`docs/operator/rbac.md`](../../operator/rbac.md) — полная матрица ролей + setup в Keycloak (включая composite `ordinis:admin` role и mapper).
- `DraftController` (record drafts) — reference architecture pool model с теми же gates.