Skip to content

ADR-0002. RBAC qua Casbin + bảng cạnh PolicyDefinition

TrườngGiá trị
Trạng tháiAccepted
Ngày2026-02-04
Người quyết địnhidentity-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:
    1. Bảng ba: User_Role, Role_Permission, cộng thêm scoping riêng
    2. 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:

VariantSubjectTargetDùng để
GROUPUserRole / Organizer / Merchant"User X có role Y" hoặc "User X thuộc merchant Z"
PERMISSIONRolePermission"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ả

ƯuNhược
Một bảng cho mọi cạnh RBAC; truy vấn đồng nhấtPolymorphic — 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 organizerChi 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 schemaAudit/diff "ai có thể làm X" cần duyệt graph

Phương án đã xem xét

Phương ánƯuNhượcLý do từ chối
Bảng ba (UserRole, RolePermission)Ngữ nghĩa rõ ràngHai migration thêm + đường ghi song songBảo trì kém hơn
Một jsonb permission set per UserĐọc nhanhKhông có lịch sử; không kế thừa group; không thể truy vấn "ai có X"Sai primitive
Spicedb / external authzTiêu chuẩn ngànhOverhead vận hành; vendor latencyQuá sớm so với quy mô

Tham chiếu

  • core/src/models/schemas/identity/policy-definition/schema.ts
  • services/policy-definition/ — 4 writer chuyên biệt
  • File model casbin (Casbin RBAC with domains)

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.