📊 Luồng Xác Thực và Phân Quyền Động
Cách thức hệ thống phân tích và áp dụng ma trận quyền hạn mỗi khi người dùng thực hiện một hành động (HTTP Request).
🛡️ Cơ Chế Xác Thực & Phân Quyền
1. Cơ chế Cấp phiên làm việc (Authentication & JWT Issuance)
Khi người dùng đăng nhập bằng tài khoản `User`:
▪ Hệ thống kiểm tra mật khẩu đã băm (hashed password) qua thư viện `bcrypt`.
▪ Sau khi xác thực thành công, hệ thống sinh bộ đôi **JWT Access Token** (phiên ngắn hạn, ví dụ: 15 phút) và **Refresh Token** (phiên dài hạn, ví dụ: 7 ngày) được lưu trữ vào bảng `UserToken`.
2. Cơ chế Hợp nhất quyền hạn động (RBAC Dynamic Checks)
Mỗi API được đính kèm metadata chỉ rõ quyền truy cập yêu cầu (ví dụ: `@RequirePermission('create:work-order')`). Khi API được gọi:
▪ Hệ thống truy vấn toàn bộ các vai trò (`Role`) đang được gán cho User đó qua bảng `UserRole`.
▪ Với mỗi vai trò, hệ thống rút ra danh sách mã quyền tương ứng từ bảng `RolePermission`.
▪ Hệ thống thực hiện phép hợp (Union) các mã quyền này và đối chiếu với quyền yêu cầu của API. Nếu trùng khớp, cho phép đi tiếp; ngược lại, trả về mã lỗi `403 Forbidden`.
3. Trường hợp miễn trừ (Super Admin Override)
Để hỗ trợ các tài khoản vận hành tối cao (Developer hoặc Admin hệ thống), thuộc tính `isSuperAdmin` nếu được set thành `true` sẽ giúp bỏ qua toàn bộ ma trận kiểm tra quyền hạn. Các request từ tài khoản Super Admin luôn mặc định được cấp quyền truy cập.