0

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:

  1. Người dùng được NHÌN THẤY những gì? (Được quyết định bởi Viewing Access Levels).

  2. 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 →\rightarrow User Groups →\rightarrow 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 →\rightarrow 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án Bcrypt hoặc Argon2i/Argon2id trong 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 Users →\rightarrow Options:

    • 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ặc Admin (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 →\rightarrow 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óm Public, vừa thuộc nhóm Guest. Ngay khi họ đăng nhập thành công, họ rời khỏi nhóm Guest và chuyển sang nhóm Registered. 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óm Guest — 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 →\rightarrow 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 Doanh và 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ưng Phòng Kỹ Thuật thì 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óm Phòng Kinh Doanh và Phòng Marketing vào đó, rồi gán bài viết vào mức Access Khố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:

  1. #__users: Lưu thông tin định danh người dùng (id, username, password, email, block).

  2. #__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).

  3. #__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).

  4. #__viewlevels: Lưu các cấp độ truy cập hiển thị. Cột rules lư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 Guest vs Registered.

  • 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí