Joomla Bài học 11: Quản lý người dùng (Users), Nhóm người dùng (User Groups) và Cấp độ truy cập (Viewing Access Levels)
Chào mừng bạn đến với Joomla Bài học 11. Trong hệ thống phân quyền ACL (Access Control List) của Joomla 5, mọi thứ đều xoay quanh hai câu hỏi cốt lõi:
-
Người dùng được NHÌN THẤY những gì? (Được quyết định bởi Viewing Access Levels).
-
Người dùng được THỰC HIỆN hành động gì? (Được quyết định bởi Permissions gắn trên User Groups - sẽ đi sâu ở Bài 12).
Ở bài học này, chúng ta sẽ giải phẫu mối quan hệ kiềng ba chân: Users User Groups Viewing Access Levels và cách chúng được lưu trữ, vận hành ở tầng cơ sở dữ liệu.
1. Users (Người dùng) và Cấu hình User Options
Để quản lý tài khoản, bạn truy cập Users Manage. Tại đây hiển thị toàn bộ danh sách thành viên của hệ thống.
-
Các thuộc tính cốt lõi của một User:
-
Account Details: Tên hiển thị (
Name), Tên đăng nhập (Username), Mật khẩu (được mã hóa bằng thuật toánBcrypthoặcArgon2i/Argon2idtrong PHP 8+), Email, trạng thái kích hoạt (Enabled) và trạng thái khóa (Blocked). -
Assigned User Groups: Một người dùng có thể thuộc về một hoặc nhiều nhóm người dùng (Many-to-Many) cùng lúc (Ví dụ: Anh Nguyễn Văn A vừa thuộc nhóm Nhân sự, vừa thuộc nhóm Biên tập viên nội bộ).
-
-
Cấu hình quan trọng trong
UsersOptions:-
Allow User Registration: Mặc định Joomla 5 tắt tính năng tự đăng ký ngoài Frontend để bảo mật. Nếu làm web thương mại điện tử hoặc diễn đàn, bạn chuyển sang Yes.
-
New User Registration Group: Nhóm mặc định khi khách tự đăng ký (thường là
Registered). -
New User Account Activation: Chọn
None(vào thẳng),Self(người dùng tự bấm link kích hoạt qua email) hoặcAdmin(quản trị viên phải duyệt tay từng tài khoản). -
Password Options: Thiết lập độ khó mật khẩu (số lượng ký tự tối thiểu, bắt buộc có chữ hoa, số, ký tự đặc biệt).
-
2. User Groups (Nhóm người dùng) - Cây kế thừa quyền hạn
Truy cập Users Groups. Joomla không gán quyền trực tiếp cho từng cá nhân mà gán thông qua User Groups. Các nhóm này được tổ chức theo cấu trúc Cây phân cấp (Nested Set Tree) — nhóm con sẽ tự động kế thừa (Inherit) toàn bộ quyền hạn của nhóm cha.
Plaintext
Public (Gốc - Tất cả mọi người, kể cả khách chưa đăng nhập)
├── Guest (Chỉ dành riêng cho khách CHƯA đăng nhập)
├── Manager (Quản lý Backend cơ bản)
│ └── Administrator (Quản trị viên cấp cao)
├── Registered (Thành viên ĐÃ đăng nhập ngoài Frontend)
│ └── Author (Được phép tạo bài viết mới)
│ └── Editor (Được sửa bài của người khác)
│ └── Publisher (Được phép xuất bản bài viết)
└── Super Users (Quyền tối cao - Bỏ qua mọi chốt chặn kiểm tra quyền)
- Điểm tinh tế của nhóm
Guest: Khi một người chưa đăng nhập vào web, họ vừa thuộc nhómPublic, vừa thuộc nhómGuest. Ngay khi họ đăng nhập thành công, họ rời khỏi nhómGuestvà chuyển sang nhómRegistered. Nhờ đó, bạn có thể tạo những khối Module (như "Banner mời đăng ký tài khoản", nút "Đăng nhập") chỉ gán cho nhómGuest— khi đăng nhập xong các nút này sẽ tự động biến mất!
3. Viewing Access Levels (Cấp độ truy cập hiển thị)
Truy cập Users Access Levels. Đây là khái niệm mà người mới học Joomla hay nhầm lẫn nhất với User Groups.
-
Quy tắc vàng để phân biệt:
-
User Group trả lời câu hỏi: "Bạn là ai trong tổ chức?" (Ví dụ: Phòng Kế toán, Phòng IT, Ban Giám đốc).
-
Viewing Access Level trả lời câu hỏi: "Tài liệu/Menu/Module này cho phép những nhóm nào được nhìn thấy?"
-
-
Cơ chế hoạt động: Một Viewing Access Level là một "chiếc hộp" chứa một hoặc nhiều User Groups bên trong. Mọi tài nguyên trong Joomla (Article, Category, Menu Item, Module, Custom Field) đều có thuộc tính Access trỏ tới một Viewing Access Level.
Bảng các Viewing Access Levels mặc định:
| Viewing Access Level | Các User Groups được đưa vào bên trong | Ý nghĩa thực tế khi gán vào Bài viết / Module |
|---|---|---|
| Public | Public (và toàn bộ các nhóm con kế thừa) | Ai vào web cũng nhìn thấy (cả khách lẫn thành viên). |
| Guest | Guest | Chỉ khách chưa đăng nhập mới thấy. Đăng nhập rồi sẽ ẩn đi. |
| Registered | Registered, Manager, Super Users | Phải đăng nhập tài khoản bất kỳ mới nhìn thấy nội dung. |
| Special | Author, Manager, Super Users | Chỉ đội ngũ nhân sự vận hành web (tác giả, quản lý, admin) mới thấy ngoài Frontend. Thành viên thường (Registered) không thấy. |
| Super Users | Super Users | Chỉ tài khoản tối cao mới nhìn thấy. |
Ví dụ thực tế: Công ty bạn có thêm 2 nhóm mới là
Phòng Kinh DoanhvàPhòng Marketing. Khi bạn đăng một bài viết "Chiến lược doanh thu Quý 4" và muốn cả 2 phòng này đều đọc được (nhưngPhòng Kỹ Thuậtthì không), bạn chỉ cần tạo một Viewing Access Level tên làKhối Thương Mại, tích chọn cả 2 nhómPhòng Kinh DoanhvàPhòng Marketingvào đó, rồi gán bài viết vào mức AccessKhối Thương Mại.
4. Giải phẫu Database & Code PHP kiểm tra quyền hiển thị (Góc nhìn Backend)
Ở tầng MySQL, hệ thống Users và Access Levels được thiết kế cực kỳ chuẩn mực qua 4 bảng:
-
#__users: Lưu thông tin định danh người dùng (id,username,password,email,block). -
#__usergroups: Lưu cây phân cấp nhóm người dùng theo thuật toán Nested Set (id,parent_id,lft,rgt,title). -
#__user_usergroup_map: Bảng trung gian (Pivot table) kết nối N-N giữa người dùng và nhóm (user_id,group_id). -
#__viewlevels: Lưu các cấp độ truy cập hiển thị. Cộtruleslưu mảng JSON chứa ID của các User Groups được phép xem (Ví dụ:[1,2,8]).
Cách kiểm tra Viewing Access Level trong PHP (Joomla 5):
Khi bạn lập trình Module hoặc Component, để lấy thông tin User hiện tại và kiểm tra các cấp độ hiển thị (Access Levels) mà người đó được phép xem (nhằm đưa vào mệnh đề WHERE access IN (...) trong SQL), bạn sử dụng Application Identity:
PHP
use Joomla\CMS\Factory;
// Lấy đối tượng User đang đăng nhập hiện tại (Identity)
$user = Factory::getApplication()->getIdentity();
// Kiểm tra xem có phải là khách chưa đăng nhập không
if ($user->guest) {
echo "Chào khách vãng lai!";
} else {
echo "Xin chào thành viên: " . $user->name . " (ID: " . $user->id . ")";
}
// Lấy mảng các ID của User Groups mà user này trực tiếp thuộc về (và kế thừa)
$userGroups = $user->getAuthorisedGroups();
// Kết quả trả về ví dụ: [1, 2] (Public và Registered)
// QUAN TRỌNG: Lấy mảng các ID của Viewing Access Levels mà user này được phép NHÌN THẤY
$authorisedViewLevels = $user->getAuthorisedViewLevels();
// Kết quả trả về ví dụ: [1, 2, 5] -> Dùng mảng này để lọc SQL: WHERE access IN (1, 2, 5)
5. Tổng kết bài học
-
Nắm vững cấu hình quản lý người dùng (Users) và các thiết lập bảo mật đăng ký tài khoản.
-
Hiểu rõ cấu trúc cây kế thừa của User Groups và cách ứng dụng thông minh nhóm
GuestvsRegistered. -
Phân biệt rạch ròi giữa User Groups (Bạn là ai) và Viewing Access Levels (Bạn được nhìn thấy gì), cũng như cách gọi hàm
$user->getAuthorisedViewLevels()ở tầng code PHP.
Trong Bài học 12, chúng ta sẽ đi vào phần thứ hai (và cũng là phần mạnh mẽ nhất) của hệ thống phân quyền: Làm chủ hệ thống phân quyền hành động ACL (Permissions) chi tiết đến từng Component và Bài viết.
All rights reserved