Bỏ qua tới nội dung
Kiên

Hệ phân quyền mà một bảng duy nhất canh mọi route

Phân quyền cho sản phẩm quản lý chi phí doanh nghiệp — danh mục quyền đọc từ database, tắt quyền theo từng doanh nghiệp, quyền phụ thuộc nhau với tự cấp kèm theo bắc cầu — và một frontend nơi route, sidebar lẫn từng nút đều đọc từ một nguồn.

Thời gian
2026
Vai trò
Làm cả backend lẫn frontend — danh mục, luật, màn quản trị, guard

Công nghệ

  • NestJS 10
  • Fastify
  • PostgreSQL
  • TypeORM
  • React 19
  • TypeScript
  • Vitest

Vấn đề

EMS là hệ thống quản lý chi phí bán cho nhiều doanh nghiệp cùng lúc. Mỗi nơi muốn một kiểu phân quyền khác nhau, và có những quyền chỉ có nghĩa khi đi cùng quyền khác. Check quyền viết cứng theo từng màn sẽ lệch nhau ngay khi có màn mới.

Cách làm

Danh mục quyền nằm trong database, không nằm trong code, và mỗi doanh nghiệp tự tắt được từng quyền cho mình.

Quyền khai báo phụ thuộc. Cấp một quyền sẽ tự cấp kèm những quyền nó cần, bắc cầu; hạ một quyền mà quyền khác đang dựa vào thì bị chặn, thay vì âm thầm để lại một vai trò hỏng.

Phía quản trị có màn vai trò, gán quyền và ma trận — ma trận vẽ thành cây theo phụ thuộc — cùng màn "xem như user" để thấy đúng cái người khác đang thấy.

Ở frontend, chặn route và sidebar cùng đọc từ một bảng ROUTE_ACCESS dùng chung, nên không thể có chuyện vào được trang mà menu lại ẩn, hay ngược lại. Từng nút được chặn qua hook useCan thay vì check rải rác.

Kết quả

Khoảng 5.490 test frontend xanh. Bảng quyền cho khoảng 300 endpoint đã soạn sẵn để backend áp dụng — viết ra rồi, nên bật phía server là một bước có chủ đích chứ không phải viết lại.