ADR-0002. RBAC qua Casbin + bảng cạnh PolicyDefinition
| Trường | Giá trị |
|---|---|
| Trạng thái | Accepted |
| Ngày | 2026-02-04 |
| Người quyết định | identity-team |
| Thay thế | — |
Bối cảnh
- Cần một mô hình RBAC linh hoạt hỗ trợ:
- Role hệ thống cố định (SUPER_ADMIN, ADMIN, OPERATOR, OWNER, CASHIER, EMPLOYEE, CUSTOMER, GUEST)
- Role tuỳ chỉnh cho merchant
- Cấp permission (Role → Permission)
- Scoping (User có thể là SCOPED_OWNER cho organizer X nhưng EMPLOYEE cho organizer Y)
- Hai cách tiếp cận tự nhiên:
- Bảng ba: User_Role, Role_Permission, cộng thêm scoping riêng
- Bảng cạnh đơn với polymorphism
subject+target
Quyết định
Dùng một bảng PolicyDefinition duy nhất với hai variant:
| Variant | Subject | Target | Dùng để |
|---|---|---|---|
GROUP | User | Role / Organizer / Merchant | "User X có role Y" hoặc "User X thuộc merchant Z" |
PERMISSION | Role | Permission | "Role Y có permission Z" |
Cộng thêm trường scope (SYSTEM / ORGANIZER / MERCHANT) để giới hạn cạnh trong một ngữ cảnh.
Mô hình RBAC của Casbin được cấu hình để đánh giá bảng này tại thời điểm request. Thay đổi từng cạnh có hiệu lực ngay lập tức (không cần bước recompile role).
Hệ quả
| Ưu | Nhược |
|---|---|
| Một bảng cho mọi cạnh RBAC; truy vấn đồng nhất | Polymorphic — không có FK ở mức DB tới subject/target |
| Trường scope cho phép một user có role khác nhau theo từng organizer | Chi phí evaluation của Casbin tăng theo số cạnh |
| Role tuỳ chỉnh của merchant là first-class (không hard-code) | Latency permission-check yêu cầu cache Redis ở phía sister |
Thêm variant mới (ví dụ RESOURCE cho ABAC) không cần migrate schema | Audit/diff "ai có thể làm X" cần duyệt graph |
Phương án đã xem xét
| Phương án | Ưu | Nhược | Lý do từ chối |
|---|---|---|---|
| Bảng ba (UserRole, RolePermission) | Ngữ nghĩa rõ ràng | Hai migration thêm + đường ghi song song | Bảo trì kém hơn |
| Một jsonb permission set per User | Đọc nhanh | Không có lịch sử; không kế thừa group; không thể truy vấn "ai có X" | Sai primitive |
| Spicedb / external authz | Tiêu chuẩn ngành | Overhead vận hành; vendor latency | Quá sớm so với quy mô |
Tham chiếu
core/src/models/schemas/identity/policy-definition/schema.tsservices/policy-definition/— 4 writer chuyên biệt- File model
casbin(Casbin RBAC with domains)