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.