docs(rbac): обновить RBAC sections после Phase 1d + Phase 2
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user