Đang trong quá trình Xây dựng
Các chi tiết tính năng trong tài liệu này có thể thay đổi trong các giai đoạn nghiên cứu, thảo luận, thiết kế và triển khai.
Phân quyền / Permissions
Kiểm soát truy cập linh hoạt thông qua vai trò và gán quyền trực tiếp.
Tổng quan
| Thuộc tính | Giá trị |
|---|---|
| ID Module | CORE-02 |
| Giai đoạn | Giai đoạn 2 |
| Mức độ ưu tiên | CAO |
| Phụ thuộc | Quản lý Người dùng |
Module Phân quyền cho phép chủ doanh nghiệp kiểm soát quyền truy cập vào các tính năng và dữ liệu thông qua một mô hình phân quyền linh hoạt. Người dùng có thể có nhiều vai trò và cũng có thể nhận quyền trực tiếp thông qua thực thể PermissionMapping. Điều này đảm bảo an ninh đồng thời cho phép phân công trách nhiệm chi tiết.
┌─────────────────────────────────────────────────────────────────────────────┐
│ MÔ HÌNH PHÂN QUYỀN │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────┐ │
│ │ PERMISSION │ │
│ │ MAPPING │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ NGƯỜI DÙNG │ │ VAI TRÒ │ │ QUYỀN │ │
│ │ │ │ │ │ │ │
│ │ Có thể có: │ │ Chứa: │ │ permission_id │ │
│ │ - Nhiều vai trò│ │ các quyền │ │ (vd: orders.*) │ │
| │ - Quyền trực tiếp│ │ │ │ │ │
│ └─────────────────┘ └─────────────┘ └─────────────────┘ │
│ │
│ Ví dụ: │
│ ├── Người dùng "Nguyễn Văn A" → Vai trò: [Thu ngân, Kho] + Trực tiếp: [reports.sales]│
│ └── Người dùng "Trần Thị B" → Vai trò: [Quản lý] + Trực tiếp: [settings.system] │
│ │
│ Quyền hiệu lực = Hợp(Quyền của các Vai trò) + Quyền Trực tiếp │
│ │
└─────────────────────────────────────────────────────────────────────────────┘Các phương pháp Gán quyền
| Phương pháp | Mô tả | Trường hợp Sử dụng |
|---|---|---|
| Qua Vai trò | Người dùng kế thừa tất cả các quyền từ các vai trò được gán | Các mẫu truy cập tiêu chuẩn |
| Trực tiếp | Quyền được gán trực tiếp cho người dùng qua PermissionMapping | Các trường hợp ngoại lệ, truy cập tạm thời |
| Kết hợp | Người dùng nhận được hợp của vai trò + quyền trực tiếp | Kiểm soát truy cập linh hoạt |
User Stories
Giai đoạn 2 - Quản lý Vai trò & Phân quyền
| ID | Với vai trò... | Tôi muốn... | Để... |
|---|---|---|---|
| US-01 | Chủ doanh nghiệp | Tạo các vai trò tùy chỉnh | tôi có thể định nghĩa các mức truy cập |
| US-02 | Chủ doanh nghiệp | Gán quyền cho các vai trò | các vai trò có các khả năng cụ thể |
| US-03 | Chủ doanh nghiệp | Gán nhiều vai trò cho nhân viên | nhân viên có thể có trách nhiệm kết hợp |
| US-04 | Chủ doanh nghiệp | Gán quyền trực tiếp cho nhân viên | tôi có thể cấp quyền ngoại lệ mà không cần tạo vai trò mới |
| US-05 | Chủ doanh nghiệp | Sử dụng các vai trò được định sẵn | tôi có thể nhanh chóng thiết lập các vai trò phổ biến |
| US-06 | Chủ doanh nghiệp | Xem nhân viên có thể truy cập những gì | tôi có thể kiểm tra các quyền hiệu lực |
| US-07 | Nhân viên | Chỉ truy cập các tính năng được phép của tôi | tôi không thể thực hiện các thay đổi trái phép |
| US-08 | Chủ doanh nghiệp | Thu hồi quyền | tôi có thể hạn chế quyền truy cập ngay lập tức |
| US-09 | Chủ doanh nghiệp | Xem các quyền hiệu lực | tôi có thể thấy các quyền kết hợp từ vai trò + trực tiếp |
Ma trận Tính năng
| Tính năng | GĐ 1 | GĐ 2 | GĐ 3 | Mô tả |
|---|---|---|---|---|
| Toàn quyền của Chủ sở hữu | ✓ | Chủ sở hữu luôn có tất cả các quyền | ||
| Tạo vai trò | ✓ | Tạo các vai trò tùy chỉnh | ||
| Vai trò được định sẵn | ✓ | 5 vai trò tích hợp sẵn | ||
| Gán quyền cho vai trò | ✓ | Gán các quyền cho vai trò | ||
| Gán nhiều vai trò | ✓ | Gán nhiều vai trò cho người dùng | ||
| Gán quyền trực tiếp | ✓ | Gán quyền trực tiếp cho người dùng | ||
| Thực thể PermissionMapping | ✓ | Lưu trữ quyền thống nhất cho người dùng/vai trò | ||
| Xem quyền hiệu lực | ✓ | Xem các quyền kết hợp từ vai trò + trực tiếp | ||
| Kiểm tra quyền | ✓ | Xem ma trận phân quyền | ||
| Phân quyền cấp cửa hàng | ✓ | Các vai trò khác nhau cho mỗi cửa hàng | ||
| Quyền dựa trên thời gian | ✓ | Quyền có hiệu lực trong giờ làm việc |
Các loại Quyền
┌──────────────────────────────────────────────────────────────────┐
│ CÂY PHÂN QUYỀN │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ├── BÁN HÀNG ├── KHO HÀNG │
│ │ ├── orders.create │ ├── inventory.view │
│ │ ├── orders.view │ ├── inventory.receive │
│ │ ├── orders.edit │ ├── inventory.transfer │
│ │ ├── orders.delete │ ├── inventory.adjust │
│ │ ├── payments.process │ └── inventory.export │
│ │ └── payments.refund │ │
│ │ ├── BÁO CÁO │
│ ├── SẢN PHẨM │ ├── reports.sales │
│ │ ├── products.view │ ├── reports.inventory │
│ │ ├── products.create │ ├── reports.tax │
│ │ ├── products.edit │ └── reports.export │
│ │ ├── products.delete │ │
│ │ └── products.price ├── CÀI ĐẶT │
│ │ │ ├── settings.users │
│ ├── HÓA ĐƠN │ ├── settings.roles │
│ │ ├── invoices.create │ ├── settings.store │
│ │ ├── invoices.view │ └── settings.system │
│ │ └── invoices.void │ │
│ │
└──────────────────────────────────────────────────────────────────┘Chi tiết Quyền
| Quyền | Mô tả | Loại |
|---|---|---|
orders.create | Tạo đơn hàng mới | Bán hàng |
orders.view | Xem lịch sử đơn hàng | Bán hàng |
orders.edit | Sửa đổi đơn hàng hiện có | Bán hàng |
orders.delete | Hủy/xóa đơn hàng | Bán hàng |
payments.process | Xử lý thanh toán | Bán hàng |
payments.refund | Thực hiện hoàn tiền | Bán hàng |
products.view | Xem danh mục sản phẩm | Sản phẩm |
products.create | Thêm sản phẩm mới | Sản phẩm |
products.edit | Chỉnh sửa chi tiết sản phẩm | Sản phẩm |
products.delete | Xóa sản phẩm | Sản phẩm |
products.price | Thay đổi giá | Sản phẩm |
inventory.view | Xem mức tồn kho | Kho hàng |
inventory.receive | Nhận hàng | Kho hàng |
inventory.transfer | Chuyển kho | Kho hàng |
inventory.adjust | Điều chỉnh kho | Kho hàng |
invoices.create | Tạo hóa đơn thuế | Hóa đơn |
invoices.view | Xem hóa đơn | Hóa đơn |
invoices.void | Hủy hóa đơn | Hóa đơn |
reports.sales | Xem báo cáo bán hàng | Báo cáo |
reports.inventory | Xem báo cáo tồn kho | Báo cáo |
reports.tax | Xem báo cáo thuế | Báo cáo |
reports.export | Xuất dữ liệu báo cáo | Báo cáo |
settings.users | Quản lý người dùng | Cài đặt |
settings.roles | Quản lý vai trò | Cài đặt |
settings.store | Cài đặt cửa hàng | Cài đặt |
settings.system | Cấu hình hệ thống | Cài đặt |
Các Vai trò được Định sẵn
| Vai trò | Tiếng Việt | Quyền | Trường hợp Sử dụng |
|---|---|---|---|
| Chủ sở hữu | Chủ hộ | TẤT CẢ | Chủ doanh nghiệp (không thể sửa đổi) |
| Quản lý | Quản lý | Tất cả trừ settings.system | Quản lý cửa hàng |
| Thu ngân | Thu ngân | orders.*, payments.process, products.view | Nhân viên bán hàng |
| Kho | Kho | inventory.*, products.view | Nhân viên kho |
| Người xem | Xem | Tất cả các quyền .view | Kế toán, kiểm toán viên |
Các Luồng chính
Luồng Tạo Vai trò
Luồng Kiểm tra Quyền
Luồng Gán quyền Trực tiếp
Kế thừa Quyền
Quy tắc Nghiệp vụ
| ID Quy tắc | Quy tắc | Mô tả |
|---|---|---|
| BR-01 | Chủ sở hữu bất biến | Vai trò Chủ sở hữu không thể sửa đổi hoặc xóa |
| BR-02 | Chủ sở hữu luôn toàn quyền | Chủ sở hữu luôn có tất cả các quyền |
| BR-03 | Tên vai trò duy nhất | Tên vai trò phải là duy nhất trong mỗi tổ chức |
| BR-04 | Phân cấp quyền | Ký tự đại diện * cấp tất cả các quyền con |
| BR-05 | Cho phép nhiều vai trò | Người dùng có thể được gán nhiều vai trò |
| BR-06 | Quyền trực tiếp | Người dùng có thể có các quyền được gán trực tiếp qua PermissionMapping |
| BR-07 | Quyền hiệu lực | Hiệu lực = Hợp của tất cả quyền vai trò + quyền trực tiếp |
| BR-08 | Không tự hạ cấp | Người dùng không thể xóa quyền quản trị của chính mình |
| BR-09 | Hiệu lực tức thì | Các thay đổi về quyền có hiệu lực ngay lập tức |
| BR-10 | Bảo vệ vai trò định sẵn | Các vai trò được định sẵn không thể bị xóa |
| BR-11 | Xóa theo tầng | Xóa một vai trò sẽ xóa nó khỏi người dùng |
| BR-12 | Nhật ký kiểm toán | Tất cả các thay đổi về quyền đều được ghi lại |
| BR-13 | Loại PermissionMapping | PermissionMapping có thể nhắm đến Người dùng hoặc Vai trò |
Tiêu chí Chấp nhận
AC-01: Tạo Vai trò
CHO một chủ sở hữu trên trang Phân quyền
KHI họ tạo một vai trò mới với tên và các quyền
THÌ - Vai trò được tạo với tên duy nhất
- PermissionMappings được tạo cho vai trò
- Vai trò xuất hiện trong danh sách vai trò
- Vai trò có thể được gán cho người dùngAC-02: Gán nhiều Vai trò
CHO một chủ sở hữu đang quản lý quyền của nhân viên
KHI họ gán nhiều vai trò cho một người dùng
THÌ - Tất cả các vai trò đã chọn đều được gán
- Người dùng nhận được hợp của tất cả các quyền từ vai trò
- Các quyền hiệu lực được hiển thị chính xácAC-03: Gán quyền Trực tiếp
CHO một chủ sở hữu đang xem quyền của một nhân viên
KHI họ thêm một quyền trực tiếp qua PermissionMapping
THÌ - Quyền được thêm trực tiếp vào người dùng
- Quyền xuất hiện trong các quyền hiệu lực của người dùng
- Quyền hoạt động độc lập với các vai tròAC-04: Tính toán Quyền hiệu lực
CHO một người dùng có vai trò [Thu ngân, Kho] và quyền trực tiếp [reports.sales]
KHI kiểm tra các quyền hiệu lực của họ
THÌ - Hiệu lực = Quyền Thu ngân + Quyền Kho + reports.sales
- Không có quyền trùng lặp trong danh sách cuối cùng
- Tất cả ba nguồn đều đóng góp vào quyền truy cậpAC-05: Kiểm tra Quyền lúc Chạy
CHO một nhân viên chỉ có vai trò "Thu ngân"
KHI họ cố gắng truy cập các tính năng kho
THÌ - Menu kho bị ẩn/vô hiệu hóa
- Truy cập URL trực tiếp hiển thị "Truy cập bị từ chối"
- Các cuộc gọi API trả về 403 ForbiddenAC-06: Sửa đổi Vai trò
CHO một chủ sở hữu đang sửa đổi một vai trò tùy chỉnh
KHI họ thêm/xóa các quyền và lưu
THÌ - PermissionMappings được cập nhật cho vai trò
- Tất cả người dùng có vai trò này đều bị ảnh hưởng
- Các phiên hoạt động phản ánh các quyền mớiAC-07: Bảo vệ Vai trò được Định sẵn
CHO 5 vai trò được định sẵn (Chủ sở hữu, Quản lý, Thu ngân, Kho, Người xem)
KHI người dùng cố gắng xóa chúng
THÌ - Tùy chọn xóa bị vô hiệu hóa
- Sửa đổi được cho phép đối với Quản lý, Thu ngân, Kho, Người xem
- Vai trò Chủ sở hữu không thể bị sửa đổi chút nàoPhụ thuộc
Phân quyền
├── Yêu cầu: Quản lý Người dùng
├── Yêu cầu bởi: Tất cả các module khác (ủy quyền)
├── Chứa: PermissionMapping (thực thể cốt lõi)
└── Tích hợp: Không có (nội bộ)| Module | Mối quan hệ |
|---|---|
| Quản lý Người dùng | Người dùng có nhiều vai trò + quyền trực tiếp |
| Tổ chức | Vai trò & PermissionMappings có phạm vi trong tổ chức |
| Điểm bán | Vai trò & quyền cấp cửa hàng (GĐ3) |
Điểm Tích hợp
┌─────────────────────────────────────────────────────────────────┐
│ TÍCH HỢP KIỂM TRA QUYỀN │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Mọi module đều kiểm tra quyền trước khi thực hiện hành động: │
│ │
│ ┌─────────┐ ┌──────────────────────┐ ┌───────────┐ │
│ │ Hành động│───▶│ Auth Middleware │───▶│ Được phép │ │
│ │ Module │ │ │ │ Có / Không│ │
│ └─────────┘ │ 1. Lấy vai trò user │ └───────────┘ │
│ │ 2. Lấy quyền vai trò │ │
│ │ 3. Lấy quyền trực tiếp│ │
│ │ 4. Tính toán hợp │ │
│ │ 5. Kiểm tra quyền │ │
│ └──────────────────────┘ │
│ │
│ - Frontend: Ẩn/vô hiệu hóa giao diện dựa trên quyền hiệu lực │
│ - Backend: Trả về 403 nếu không có trong quyền hiệu lực │
│ - Kiểm toán: Ghi lại tất cả các lần kiểm tra quyền │
│ │
│ Truy vấn PermissionMapping: │
│ SELECT permission_code FROM permission_mapping │
│ WHERE (target_type='ROLE' AND target_id IN user_roles) │
│ OR (target_type='USER' AND target_id = user_id) │
│ │
└─────────────────────────────────────────────────────────────────┘Ảnh chụp màn hình
Ảnh chụp màn hình
Ảnh chụp màn hình sẽ được thêm sau khi triển khai giao diện người dùng.
Các Module Liên quan
- Quản lý Người dùng - Tài khoản người dùng
- Tổ chức - Vai trò cấp tổ chức
- Điểm bán - Quyền cấp cửa hàng
- Báo cáo - Kiểm soát truy cập báo cáo