Chương 5: Người dùng và quyền — Ai có thể xem cái gì
Chương trước chúng ta đã xây xong form và trang chi tiết, hệ thống ticket đã có thể nhập và xem dữ liệu bình thường. Nhưng hiện tại có một vấn đề — tất cả mọi người sau khi đăng nhập đều thấy cùng một thứ. Nhân viên submit ticket có thể thấy trang quản lý, kỹ thuật viên có thể xóa phân loại… Như vậy không ổn.
Chương này, chúng ta sẽ thêm "barrier" cho hệ thống: tạo vai trò, cấu hình quyền menu và phạm vi dữ liệu, thực hiện người khác nhau, thấy menu khác nhau, thao tác dữ liệu khác nhau.
5.1 Hiểu vai trò (Role)
Trong NocoBase, vai trò chính là một tập hợp các quyền. Bạn không cần cấu hình quyền riêng cho từng Người dùng, mà định nghĩa trước một vài vai trò, rồi cho Người dùng vào vai trò tương ứng.
NocoBase sau khi cài đặt tự mang ba vai trò:
- Root: Super admin, có tất cả quyền, không thể xóa
- Admin: Admin, mặc định có quyền cấu hình giao diện
- Member: Thành viên thông thường, mặc định ít quyền
Nhưng ba vai trò tích hợp này không đủ dùng. Hệ thống ticket của chúng ta cần phân chia chi tiết hơn, nên tiếp theo chúng ta tạo 3 vai trò tùy chỉnh.
5.2 Tạo ba vai trò
Mở menu cài đặt ở góc trên bên phải, vào Người dùng và quyền → Quản lý vai trò.
Click Thêm vai trò, lần lượt tạo:

Mã vai trò là ID duy nhất dùng nội bộ trong hệ thống, sau khi tạo không thể đổi, khuyến nghị dùng chữ thường tiếng Anh. Tên vai trò có thể sửa bất cứ lúc nào.

Sau khi tạo xong, trong danh sách vai trò có thể thấy ba vai trò mới của chúng ta.
5.3 Cấu hình quyền menu
Vai trò đã tạo xong, tiếp theo cho hệ thống biết: Mỗi vai trò có thể thấy những menu nào.
Click vào một vai trò để vào trang cấu hình quyền, tìm tab Quyền truy cập menu. Ở đây sẽ liệt kê tất cả menu item trong hệ thống, đánh dấu là cho phép truy cập, bỏ đánh dấu là ẩn.
Admin (admin-helpdesk): Đánh dấu tất cả
- Quản lý ticket, quản lý phân loại, dashboard — đều có thể thấy
Kỹ thuật viên (technician): Đánh dấu một phần
- ✅ Quản lý ticket
- ✅ Dashboard
- ❌ Quản lý phân loại (kỹ thuật viên không cần quản lý phân loại)
Người dùng thông thường (user): Quyền tối thiểu
- ✅ Quản lý ticket (chỉ thấy ticket của mình)
- ❌ Quản lý phân loại
- ❌ Dashboard

Mẹo nhỏ: NocoBase có một cài đặt tiện lợi — "menu item mới mặc định cho phép truy cập". Nếu bạn không muốn mỗi lần thêm trang mới phải đánh dấu thủ công, có thể bật tùy chọn này cho vai trò admin. Đối với vai trò Người dùng thông thường, khuyến nghị tắt nó.
5.4 Cấu hình quyền dữ liệu
Quyền menu quản lý "có thể vào trang này hay không", quyền dữ liệu quản lý "sau khi vào trang có thể thấy dữ liệu nào".
Khái niệm chính: Phạm vi dữ liệu (Data Scope).
Trong cấu hình quyền của vai trò, chuyển sang tab Quyền thao tác bảng dữ liệu. Tìm bảng "Ticket" của chúng ta, click vào để cấu hình riêng.

Người dùng thông thường: Chỉ xem ticket mình đã submit
- Tìm quyền Xem của bảng "Ticket"
- Phạm vi dữ liệu chọn → Dữ liệu của mình
- Như vậy Người dùng thông thường chỉ có thể thấy ticket "có người tạo là chính mình" (cần lưu ý, tùy chọn mặc định lấy theo Field người tạo của hệ thống, không phải Field người submit, tuy nhiên có thể sửa)
Tương tự, cài quyền "chỉnh sửa" và "xóa" cũng thành Dữ liệu của mình (hoặc đơn giản không cấp quyền xóa).

Về cấu hình toàn cục: Nếu chỉ cấu hình bảng ticket, có thể dẫn đến không thấy được dữ liệu khác, các tùy chọn cấu hình (như bảng phân loại, người xử lý). Hệ thống của chúng ta hiện tại tương đối đơn giản, lần này trong toàn cục đánh dấu trực tiếp "Xem tất cả dữ liệu", với các bảng nhạy cảm về phạm vi dữ liệu, sẽ cấu hình quyền riêng

Kỹ thuật viên: Chỉ xem ticket được phân cho mình
- Tìm quyền Xem của bảng "Ticket"
- Phạm vi dữ liệu chọn → Dữ liệu của mình
- Nhưng ở đây có một chi tiết — "Dữ liệu của mình" của NocoBase mặc định lọc theo người tạo. Nếu chúng ta muốn lọc theo "người xử lý", có thể điều chỉnh thêm trong quyền thao tác toàn cục, hoặc trong trang frontend dùng điều kiện lọc của Block dữ liệu kết hợp để thực hiện

Kỹ thuật thực dụng: Còn có thể cài điều kiện lọc mặc định trên Block bảng để hỗ trợ kiểm soát quyền, ví dụ "người xử lý = Người dùng hiện tại". Tuy nhiên cấu hình trang là có hiệu lực toàn cục, admin cũng sẽ bị giới hạn. Phương án dung hòa: cấu hình "người xử lý = Người dùng hiện tại hoặc người submit = Người dùng hiện tại", tương thích với Người dùng thông thường và kỹ thuật viên; admin nếu cần view toàn cục, lại tạo riêng một trang không có lọc.

Admin: Thấy tất cả dữ liệu
Phạm vi dữ liệu của vai trò admin chọn Tất cả dữ liệu, mở tất cả các thao tác. Đơn giản trực tiếp.

5.5 Action phân công ticket
Trước khi cấu hình quyền xong, chúng ta thêm trước một tính năng thực dụng cho danh sách ticket: phân công người xử lý. Admin có thể trực tiếp phân công ticket cho một kỹ thuật viên nào đó trong danh sách, không cần vào trang chỉnh sửa để sửa cả đống Field.
Thực hiện rất đơn giản — thêm một nút popup tùy chỉnh vào cột Action của bảng:
- Vào chế độ UI editor, trong cột Action của bảng danh sách ticket, click "+" để thêm một nút Action "Popup".

- Đổi tiêu đề nút thành "Phân công" (click tùy chọn cấu hình nút để sửa tiêu đề).

Vì chỉ có một thông tin phân công đơn giản, chúng ta chọn popup đơn giản phù hợp hơn, không phải drawer, ở góc trên bên phải nút chọn cài đặt popup, chọn dialog hẹp > xác nhận

- Click nút "Phân công" để mở popup, trong popup "Tạo Block → Block dữ liệu → Form (Edit)", chọn bảng dữ liệu hiện tại.
- Trong form chỉ đánh dấu một Field "Người xử lý", và trong tùy chọn cấu hình Field cài thành bắt buộc.
- Thêm nút Action "Submit".

Như vậy, admin trong danh sách ticket click "Phân công", sẽ bật một form cực đơn giản, chọn người xử lý xong submit là được. Nhanh chóng, chính xác, không sửa nhầm các Field khác.
Dùng linkage rule để kiểm soát hiển thị/ẩn nút
Nút "Phân công" chỉ admin mới cần dùng, Người dùng thông thường và kỹ thuật viên thấy nó ngược lại gây bối rối. Chúng ta có thể dùng linkage rule dựa vào vai trò của Người dùng hiện tại để kiểm soát hiển thị/ẩn của nút:
- Trong chế độ UI editor, click tùy chọn cấu hình của nút "Phân công", tìm "Linkage rule".
- Thêm một rule, điều kiện cài thành: Người dùng hiện tại / Vai trò / Tên vai trò không bằng Admin (tức là tên tương ứng với vai trò admin-helpdesk).
- Action khi thỏa mãn điều kiện: Ẩn nút này.
Như vậy, chỉ Người dùng có vai trò admin mới có thể thấy nút "Phân công", các vai trò khác sau khi đăng nhập nút này sẽ tự động ẩn.

5.6 Tạo Người dùng test và trải nghiệm
Quyền đã cấu hình xong, chúng ta thực tế kiểm chứng một chút.
Vào Quản lý Người dùng (trung tâm cài đặt hoặc trang quản lý Người dùng bạn đã xây trước đó), tạo 3 Người dùng test:

Sau khi tạo xong, lần lượt dùng ba tài khoản này đăng nhập hệ thống, kiểm tra hai việc:
1. Menu có hiển thị đúng như dự kiến không?
- Alice → Có thể thấy tất cả menu

- Bob → Chỉ thấy Quản lý ticket và Dashboard

- Charlie → Chỉ thấy "Ticket của tôi"

2. Dữ liệu có được lọc đúng như dự kiến không?
- Trước tiên dùng Alice tạo vài ticket, lần lượt phân cho người xử lý khác nhau
- Chuyển sang Bob đăng nhập → Chỉ thấy ticket được phân cho mình
- Chuyển sang Charlie đăng nhập → Chỉ thấy ticket mình đã submit
Có ngầu không? Cùng một hệ thống, Người dùng khác nhau thấy nội dung hoàn toàn khác nhau! Đây chính là sức mạnh của quyền.
Tóm tắt
Chương này chúng ta đã hoàn thành hệ thống quyền của hệ thống ticket:
- 3 vai trò: Admin, kỹ thuật viên, Người dùng thông thường
- Quyền menu: Kiểm soát mỗi vai trò có thể vào những trang nào
- Quyền dữ liệu: Kiểm soát mỗi vai trò có thể thấy dữ liệu nào (thực hiện qua phạm vi dữ liệu)
- Test kiểm chứng: Dùng các tài khoản khác nhau đăng nhập, xác nhận quyền có hiệu lực
Đến đây, hệ thống ticket đã ra dáng — có thể nhập, có thể xem, có thể kiểm soát truy cập theo vai trò. Nhưng tất cả thao tác đều là thủ công.
Xem trước chương sau
Chương sau chúng ta học Workflow — cho hệ thống tự động làm việc giúp chúng ta. Ví dụ ticket sau khi submit tự động thông báo người xử lý, khi trạng thái thay đổi tự động ghi log.
Tài nguyên liên quan
- Quản lý Người dùng — Quản lý Người dùng chi tiết
- Vai trò và quyền — Mô tả cấu hình vai trò
- Phạm vi dữ liệu — Kiểm soát quyền cấp dữ liệu

