Phân quyền là một trong những nền tảng quan trọng nhất khi xây dựng ứng dụng web hoặc mobile. Hệ thống càng lớn, càng nhiều tính năng thì vấn đề kiểm soát ai được làm gì càng trở nên cấp thiết. Không có phân quyền bài bản, ứng dụng sẽ sớm rơi vào hỗn loạn, phát sinh lỗi bảo mật, rò rỉ dữ liệu hoặc xung đột trong vận hành.
Bài viết này giúp bạn hiểu từ gốc rễ cách xây dựng phân quyền, từ mô hình dữ liệu, kiến trúc, cho đến cách triển khai trong API và front-end.

1. Tại sao cần phân quyền
Mọi ứng dụng có người dùng đều phải giải bài toán phân quyền. Một số lý do chính:
-
Bảo vệ tài nguyên quan trọng, tránh người không có quyền truy cập vào dữ liệu nhạy cảm.
-
Giảm rủi ro vận hành khi mỗi vai trò chỉ được thực hiện những hành động phù hợp.
-
Tăng khả năng mở rộng, vì hệ thống có thể phân tách trách nhiệm rõ ràng.
-
Tiết kiệm thời gian phát triển lâu dài. Nếu có phân quyền chuẩn ngay từ đầu, từ đó về sau bạn chỉ cần gắn quyền vào chức năng mới.
Một hệ thống không có phân quyền hoặc phân quyền bằng cảm tính sẽ rất khó duy trì khi số lượng chức năng tăng lên.
2. Các mô hình phân quyền phổ biến
Role-based Access Control (RBAC)
Đây là mô hình phổ biến nhất. Người dùng được gán vào một hoặc nhiều vai trò. Mỗi vai trò có bộ quyền tương ứng.
Ví dụ với ứng dụng học online: Student, Instructor, Admin.
Ưu điểm của RBAC là dễ hiểu, dễ triển khai, phù hợp với khoảng 90 phần trăm dự án.
Permission-based Access Control
Thay vì gán quyền vào vai trò, bạn gán quyền trực tiếp cho người dùng. Mô hình này linh hoạt hơn nhưng dễ trở nên phức tạp nếu không quản lý tốt.
Attribute-based Access Control (ABAC)
ABAC xét quyền dựa trên thuộc tính của người dùng, tài nguyên, bối cảnh và điều kiện.
Một ví dụ điển hình là cho phép xem báo cáo nếu người dùng thuộc phòng ban A và truy cập trong giờ làm việc.
ABAC mạnh hơn, nhưng chỉ nên dùng khi dự án đòi hỏi kiểm soát cực kỳ chi tiết.
Kết hợp nhiều mô hình
Phần lớn doanh nghiệp lớn dùng RBAC kết hợp với Permission-based để đạt được độ linh hoạt tối ưu.
3. Thiết kế cấu trúc dữ liệu phân quyền
Phổ biến nhất là mô hình RBAC ba bảng:
Users Roles Permissions
Cách liên kết:
Users – many-to-many – Roles Roles – many-to-many – Permissions
Với mô hình này, bạn có thể kiểm soát gần như tất cả luồng phân quyền trong ứng dụng.
Ví dụ về permissions trong một hệ thống thương mại điện tử:
product.create product.edit product.delete order.view order.refund report.export
Quan trọng nhất là phải định nghĩa rõ “quyền” là một hành động cụ thể trên một tài nguyên. Cách định nghĩa càng nhất quán, hệ thống sau này càng dễ mở rộng.
4. Áp dụng phân quyền trong API
Một API chuẩn sẽ có ba lớp kiểm tra.
Kiểm tra xác thực
Kiểm tra người dùng có đăng nhập hay không. Ví dụ thông qua Access Token hoặc Session.
Kiểm tra vai trò hoặc quyền
Kiểm tra vai trò của người dùng có chứa quyền mà API yêu cầu hay không.
Ví dụ middleware dạng:
requirePermission(‘product.create’)
Middleware này sẽ đọc user từ token, lấy danh sách permissions và kiểm tra xem quyền có tồn tại không. Nếu không có, trả về mã 403 Forbidden.
Kiểm tra ràng buộc kinh doanh
Thậm chí khi có quyền, một số API cần kiểm tra thêm điều kiện.
Ví dụ: Admin có quyền refund nhưng chỉ được refund với đơn hàng ở trạng thái Completed.
Điều kiện này không phải permission mà là logic nghiệp vụ nên được kiểm tra bên trong service.
5. Phân quyền trong giao diện front-end
Back-end kiểm tra bảo mật, nhưng front-end cũng phải kiểm tra hiển thị để tránh trải nghiệm người dùng kém.
Ba nơi cần áp dụng:
-
Hiển thị hoặc ẩn menu, nút thao tác theo quyền.
-
Giao diện edit form chỉ hiển thị những trường mà người dùng được phép sửa.
-
Điều hướng trang tránh để người dùng mở trang mà họ không có quyền.
Quan trọng là front-end chỉ để cải thiện trải nghiệm, không phải nơi đảm bảo bảo mật. API mới là lớp kiểm tra thực sự.
6. Quy trình xây dựng hệ thống phân quyền
Một quy trình bài bản thường bao gồm:
-
Liệt kê toàn bộ chức năng của hệ thống.
-
Xác định tài nguyên và hành động tương ứng.
-
Đặt tên permission nhất quán.
-
Nhóm các quyền thành vai trò.
-
Tạo middleware hoặc guard kiểm tra quyền.
-
Tích hợp vào từng API.
-
Tích hợp vào front-end.
-
Xây dựng trang quản lý vai trò và phân quyền động.
Khi quy trình rõ ràng ngay từ đầu, bạn sẽ hạn chế tình trạng chắp vá.
7. Lời khuyên dành cho developer
Một số kinh nghiệm quan trọng khi triển khai:
-
Nên dùng Permission thay vì chỉ dùng Role để tránh hệ thống trở nên cứng nhắc.
-
Nên chuẩn hóa permission theo định dạng module.action để dễ mở rộng.
-
Hạn chế gắn logic nghiệp vụ vào permission. Permission chỉ nên là hành động.
-
Nên cache danh sách quyền của người dùng để giảm tải database.
-
Với ứng dụng lớn, hãy xây trang UI để quản lý vai trò và phân quyền một cách động.
-
Tránh hard-code tên quyền rải rác trong mã. Nên gom tất cả permission vào một file constant.
8. Khi nào nên triển khai phân quyền
Có hai thời điểm lý tưởng:
-
Khi sản phẩm đã có nhiều tính năng và bắt đầu có nhiều loại người dùng khác nhau.
-
Khi xây dựng sản phẩm mới nhưng dự đoán sẽ có sự phân tách quyền trong tương lai gần.
Bạn không nên để đến khi số lượng chức năng quá nhiều mới nghĩ đến phân quyền vì sẽ phải sửa lại rất nhiều code.







