# Core `cp-rbac` — RBAC catalog & export

> 07/7/2026 · Repo: **controlplane** · Đánh giá: **⚠ Hai nguồn sự thật — cần hợp nhất** · Bản HTML: [cp-rbac.html](cp-rbac.html) · [Review tổng core](core-review-2026-07-07.md)

## 1. Vai trò
Catalog quyền ở CP: **Module/App → FeatureGroup → Feature → Permission** + **Role/RoleGroup** gán theo user × workspace; export contract `opengate-rbac-export/v1` cho runtime ingest.

## 2. Thành phần chính

| Thành phần | Vai trò |
|---|---|
| **Module · App · FeatureGroup · Feature · Permission** | Catalog quyền 4 cấp — nguồn khai từ manifest module |
| **Role · RoleGroup · rbacService** | Bó quyền, gán user theo workspace |
| **rbacExportService** | Xuất RBAC per-workspace → JSON contract cho RT ingest (service-to-service Bearer) |
| **RT phía nhận** | `rt_role` với `origin='cp'` (sync replace ghi đè) vs `origin='local'` (sống sót qua pull) |

## 3. Hiện trạng (đọc từ code)
- Mô hình catalog 4 cấp khớp convention manifest `key.group.feature.action` — nhất quán
- Cơ chế sync CP → RT có phân biệt origin (cp/local) — module cài runtime mà CP không quản vẫn phân quyền được
- ⚠ **Hai nguồn sự thật đang chạy song song:** permissionCache (CP identity) UNION engine (rt_role) trong `authorize.js` — đúng cho giai đoạn chuyển tiếp nhưng khó suy luận quyền
- ⚠ Data scope (row-level) thiết kế xong chưa nối — đã có plan riêng

## 4. Khuyến nghị — tham chiếu hệ phổ biến

| Tham chiếu | Khuyến nghị |
|---|---|
| **Casbin / OPA — một policy store duy nhất** | **Hoàn tất RT-16:** engine (rt_role) làm authority duy nhất ở runtime; CP chỉ là nguồn sync + UI quản trị. Gỡ nhánh UNION trong authorize.js khi di cư xong |
| **Odoo record rules** | Nối data scope theo plan-data-scope đã viết (grant kind:rule → buildWhere) — pilot module student |
| **AWS IAM** | Thêm **policy simulator** nhỏ: màn hình admin nhập user + permission code → trả allow/deny + lý do (role nào cấp) — cứu debug phân quyền rất nhiều |

## 5. Liên kết trong core
- **rt-authz** — phía thực thi
- **sdk** — manifest khai permissions[]
- **cp-identity** — session mang quyền


## Ma trận tác nhân × năng lực

Core không phải module nghiệp vụ — ma trận theo **tác nhân**, kèm cơ chế/quyền gate. R đọc · W thực hiện · A duyệt.

| Năng lực | Cơ chế / quyền gate | SUPER | OWNER/QTHT | DEV | SVC | USER |
|---|---|:--:|:--:|:--:|:--:|:--:|
| Catalog permission (từ manifest) | sync tự động khi cài module | R | — | — | W (sync) | — |
| Role / RoleGroup per workspace | quyền quản trị WS trên CP | W | W | — | — | — |
| Gán role cho member | membership + quyền quản trị | — | W | — | — | — |
| Export RBAC → runtime | Bearer service-to-service | — | — | — | R | — |

SUPER = super admin CP · OWNER/QTHT = quản trị WS · DEV = developer/publisher · SVC = service-to-service · USER = người dùng cuối. Mục **(đích)** = theo khuyến nghị P1–P5.
