Bỏ qua để đến nội dung

Hệ thống người dùng XOOPS

Hệ thống người dùng XOOPS quản lý tài khoản người dùng, xác thực, ủy quyền, thành viên nhóm và quản lý phiên. Nó cung cấp một khuôn khổ mạnh mẽ để bảo mật ứng dụng của bạn và kiểm soát quyền truy cập của người dùng.

graph TD
A[User System] -->|manages| B[XoopsUser]
A -->|manages| C[XoopsGroup]
A -->|handles| D[Authentication]
A -->|handles| E[Sessions]
D -->|validates| F[Username/Password]
D -->|validates| G[Email/Token]
D -->|triggers| H[Post-Login Hooks]
E -->|manages| I[Session Data]
E -->|manages| J[Session Cookies]
B -->|belongs to| C
B -->|has| K[Permissions]
B -->|has| L[Profile Data]
C -->|defines| M[Access Levels]
C -->|contains| N[Multiple Users]

Đối tượng người dùng chính class đại diện cho tài khoản người dùng.

namespace Xoops\Core\User;
class XoopsUser extends XoopsObject
{
protected int $uid = 0;
protected string $uname = '';
protected string $email = '';
protected string $pass = '';
protected int $uregdate = 0;
protected int $ulevel = 0;
protected array $groups = [];
protected array $permissions = [];
}
public function __construct(int $uid = null)

Tạo một đối tượng người dùng mới, tùy chọn tải từ cơ sở dữ liệu theo ID.

Thông số:

Tham sốLoạiMô tả
$uidintID người dùng để tải (tùy chọn)

Ví dụ:

// Create new user
$user = new XoopsUser();
// Load existing user
$user = new XoopsUser(123);
Bất động sảnLoạiMô tả
uidintID người dùng
unamechuỗiTên người dùng
emailchuỗiĐịa chỉ email
passchuỗiBăm mật khẩu
uregdateintDấu thời gian đăng ký
ulevelintCấp độ người dùng (9=admin, 1=người dùng)
groupsmảngID nhóm
permissionsmảngCờ cho phép

Lấy ID của người dùng.

public function getID(): int
public function getUid(): int // Alias

Trả về: int - ID người dùng

Ví dụ:

$user = new XoopsUser(1);
echo $user->getID(); // 1
echo $user->getUid(); // 1

Lấy tên hiển thị của người dùng.

public function getUnameReal(): string

Trả về: string - Tên thật của người dùng

Ví dụ:

$realName = $user->getUnameReal();
echo "Hello, $realName";

Lấy địa chỉ email của người dùng.

public function getEmail(): string

Trả về: string - Địa chỉ email

Ví dụ:

$email = $user->getEmail();
mail($email, 'Welcome', 'Welcome to XOOPS');

Nhận hoặc đặt một biến người dùng.

public function getVar(string $key, string $format = 's'): mixed
public function setVar(string $key, mixed $value, bool $notGpc = false): bool

Ví dụ:

// Get values
$username = $user->getVar('uname');
$email = $user->getVar('email', 's'); // Formatted for display
// Set values
$user->setVar('uname', 'newusername');
$user->setVar('email', 'user@example.com');

Nhận tư cách thành viên nhóm của người dùng.

public function getGroups(): array

Trả về: array - Mảng ID nhóm

Ví dụ:

$groups = $user->getGroups();
echo "Member of " . count($groups) . " groups";

Kiểm tra xem người dùng có thuộc một nhóm hay không.

public function isInGroup(int $groupId): bool

Thông số:

Tham sốLoạiMô tả
$groupIdintID nhóm để kiểm tra

Trả về: bool - Đúng nếu ở trong nhóm

Ví dụ:

if ($user->isInGroup(1)) { // 1 = Webmasters
echo 'User is a webmaster';
}

Kiểm tra xem người dùng có phải là administrator hay không.

public function isAdmin(): bool

Trả về: bool - Đúng nếu admin

Ví dụ:

if ($user->isAdmin()) {
// Show admin controls
echo '<a href="admin/">Admin Panel</a>';
}

Nhận thông tin hồ sơ người dùng.

public function getProfile(): array

Trả về: array - Dữ liệu hồ sơ

Ví dụ:

$profile = $user->getProfile();
echo 'Bio: ' . $profile['bio'];

Kiểm tra xem tài khoản người dùng có đang hoạt động hay không.

public function isActive(): bool

Trả về: bool - Đúng nếu hoạt động

Ví dụ:

if ($user->isActive()) {
// Allow user access
} else {
// Restrict access
}

Cập nhật dấu thời gian đăng nhập cuối cùng của người dùng.

public function updateLastLogin(): bool

Trả về: bool - Đúng khi thành công

Ví dụ:

if ($user->updateLastLogin()) {
echo 'Login recorded';
}

Quản lý nhóm người dùng và quyền.

namespace Xoops\Core\User;
class XoopsGroup extends XoopsObject
{
protected int $groupid = 0;
protected string $name = '';
protected string $description = '';
protected int $group_type = 0;
protected array $users = [];
}
Hằng sốGiá trịMô tả
TYPE_NORMAL0Nhóm người dùng thông thường
TYPE_ADMIN1Nhóm hành chính
TYPE_SYSTEM2Nhóm hệ thống

Lấy tên nhóm.

public function getName(): string

Trả về: string - Tên nhóm

Ví dụ:

$group = new XoopsGroup(1);
echo $group->getName(); // "Webmasters"
public function getDescription(): string

Trả về: string - Mô tả

Ví dụ:

echo $group->getDescription();

Nhận thành viên nhóm.

public function getUsers(): array

Trả về: array - Mảng ID người dùng

Ví dụ:

$users = $group->getUsers();
echo "Group has " . count($users) . " members";

Thêm người dùng vào nhóm.

public function addUser(int $uid): bool

Thông số:

Tham sốLoạiMô tả
$uidintID người dùng

Trả về: bool - Đúng khi thành công

Ví dụ:

$group = new XoopsGroup(2); // Editors
$group->addUser(123);
$groupHandler->insert($group);

Xóa một người dùng khỏi nhóm.

public function removeUser(int $uid): bool

Ví dụ:

$group->removeUser(123);
/**
* User login
*/
function xoops_user_login(string $uname, string $pass, bool $rememberMe = false): ?XoopsUser
{
global $xoopsDB;
// Sanitize username
$uname = trim($uname);
// Get user from database
$query = $xoopsDB->prepare(
'SELECT * FROM ' . $xoopsDB->prefix('users') .
' WHERE uname = ? AND active = 1'
);
$query->bind_param('s', $uname);
$query->execute();
$result = $query->get_result();
if ($result->num_rows === 0) {
return null; // User not found
}
$row = $result->fetch_assoc();
// Verify password
if (!password_verify($pass, $row['pass'])) {
return null; // Invalid password
}
// Load user object
$user = new XoopsUser($row['uid']);
// Update last login
$user->updateLastLogin();
// Handle "Remember Me"
if ($rememberMe) {
// Set persistent cookie
setcookie(
'xoops_user_remember',
$user->uid(),
time() + (30 * 24 * 60 * 60), // 30 days
'/',
$_SERVER['HTTP_HOST'] ?? ''
);
}
return $user;
}
/**
* Hash password securely
*/
function xoops_hash_password(string $password): string
{
return password_hash($password, PASSWORD_BCRYPT, [
'cost' => 12
]);
}
/**
* Verify password
*/
function xoops_verify_password(string $password, string $hash): bool
{
return password_verify($password, $hash);
}
/**
* Check if password needs rehashing
*/
function xoops_password_needs_rehash(string $hash): bool
{
return password_needs_rehash($hash, PASSWORD_BCRYPT, [
'cost' => 12
]);
}
namespace Xoops\Core;
class SessionManager
{
protected array $data = [];
protected string $sessionId = '';
public function start(): void {}
public function get(string $key): mixed {}
public function set(string $key, mixed $value): void {}
public function destroy(): void {}
}
<?php
session_start();
// Regenerate session ID for security
session_regenerate_id(true);
// Set session timeout
ini_set('session.gc_maxlifetime', 3600); // 1 hour
// Store user in session
if ($user) {
$_SESSION['xoops_user'] = $user;
$_SESSION['xoops_uid'] = $user->getID();
$_SESSION['xoops_uname'] = $user->getVar('uname');
}
/**
* Get current user from session
*/
function xoops_get_current_user(): ?XoopsUser
{
if (isset($_SESSION['xoops_user']) && $_SESSION['xoops_user'] instanceof XoopsUser) {
return $_SESSION['xoops_user'];
}
return null;
}
/**
* Check if user is logged in
*/
function xoops_is_user_logged_in(): bool
{
return isset($_SESSION['xoops_uid']) && $_SESSION['xoops_uid'] > 0;
}
/**
* User logout
*/
function xoops_user_logout()
{
global $xoopsUser;
// Log the logout
if ($xoopsUser) {
error_log('User ' . $xoopsUser->getVar('uname') . ' logged out');
}
// Destroy session data
$_SESSION = [];
// Delete session cookie
if (ini_get('session.use_cookies')) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly']
);
}
// Destroy session
session_destroy();
}
Hằng sốGiá trịMô tả
XOOPS_PERMISSION_NONE0Không được phép
XOOPS_PERMISSION_VIEW1Xem nội dung
XOOPS_PERMISSION_SUBMIT2Gửi nội dung
XOOPS_PERMISSION_EDIT4Chỉnh sửa nội dung
XOOPS_PERMISSION_DELETE8Xóa nội dung
XOOPS_PERMISSION_ADMIN16Quyền truy cập của quản trị viên
/**
* Check if user has permission
*/
function xoops_check_permission($user, $resource, $permission)
{
if (!$user) {
return false;
}
// Admins have all permissions
if ($user->isAdmin()) {
return true;
}
// Check group permissions
$groups = $user->getGroups();
foreach ($groups as $groupId) {
if (xoops_group_has_permission($groupId, $resource, $permission)) {
return true;
}
}
return false;
}

UserHandler quản lý các hoạt động liên tục của người dùng.

/**
* Get user handler
*/
$userHandler = xoops_getHandler('user');
/**
* Create new user
*/
$user = new XoopsUser();
$user->setVar('uname', 'newuser');
$user->setVar('email', 'user@example.com');
$user->setVar('pass', xoops_hash_password('password123'));
$user->setVar('uregdate', time());
$user->setVar('uactive', 1);
if ($userHandler->insert($user)) {
echo 'User created with ID: ' . $user->getID();
}
/**
* Update user
*/
$user = $userHandler->get(123);
$user->setVar('email', 'newemail@example.com');
$userHandler->insert($user);
/**
* Get user by name
*/
$user = $userHandler->findByUsername('john');
/**
* Delete user
*/
$userHandler->delete($user);
/**
* Search users
*/
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('uname', '%admin%', 'LIKE'));
$users = $userHandler->getObjects($criteria);

Ví dụ hoàn chỉnh về quản lý người dùng

Phần tiêu đề “Ví dụ hoàn chỉnh về quản lý người dùng”
<?php
/**
* Complete user authentication and profile example
*/
require_once XOOPS_ROOT_PATH . '/include/common.inc.php';
$xoopsUser = $GLOBALS['xoopsUser'];
// Check if user is logged in
if (!$xoopsUser || !$xoopsUser->isActive()) {
redirect_header(XOOPS_URL, 3, 'Please login');
}
// Get user handler
$userHandler = xoops_getHandler('user');
// Get current user with fresh data
$currentUser = $userHandler->get($xoopsUser->getID());
// User profile page
echo '<h1>Profile: ' . htmlspecialchars($currentUser->getVar('uname')) . '</h1>';
echo '<div class="user-profile">';
echo '<p><strong>Username:</strong> ' . htmlspecialchars($currentUser->getVar('uname')) . '</p>';
echo '<p><strong>Email:</strong> ' . htmlspecialchars($currentUser->getVar('email')) . '</p>';
echo '<p><strong>Registered:</strong> ' . date('Y-m-d H:i:s', $currentUser->getVar('uregdate')) . '</p>';
echo '<p><strong>Groups:</strong> ';
$groupHandler = xoops_getHandler('group');
$groups = $currentUser->getGroups();
$groupNames = [];
foreach ($groups as $groupId) {
$group = $groupHandler->get($groupId);
if ($group) {
$groupNames[] = htmlspecialchars($group->getName());
}
}
echo implode(', ', $groupNames);
echo '</p>';
// Admin status
if ($currentUser->isAdmin()) {
echo '<p><strong>Status:</strong> Administrator</p>';
}
echo '</div>';
// Change password form
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['change_password'])) {
$oldPassword = $_POST['old_password'] ?? '';
$newPassword = $_POST['new_password'] ?? '';
$confirmPassword = $_POST['confirm_password'] ?? '';
// Verify old password
if (!password_verify($oldPassword, $currentUser->getVar('pass'))) {
echo '<div class="error">Current password is incorrect</div>';
} elseif ($newPassword !== $confirmPassword) {
echo '<div class="error">New passwords do not match</div>';
} elseif (strlen($newPassword) < 6) {
echo '<div class="error">Password must be at least 6 characters</div>';
} else {
// Update password
$currentUser->setVar('pass', xoops_hash_password($newPassword));
if ($userHandler->insert($currentUser)) {
echo '<div class="success">Password changed successfully</div>';
} else {
echo '<div class="error">Failed to update password</div>';
}
}
}
// Password change form
echo '<form method="post">';
echo '<h3>Change Password</h3>';
echo '<div class="form-group">';
echo '<label>Current Password:</label>';
echo '<input type="password" name="old_password" required>';
echo '</div>';
echo '<div class="form-group">';
echo '<label>New Password:</label>';
echo '<input type="password" name="new_password" required>';
echo '</div>';
echo '<div class="form-group">';
echo '<label>Confirm Password:</label>';
echo '<input type="password" name="confirm_password" required>';
echo '</div>';
echo '<button type="submit" name="change_password">Change Password</button>';
echo '</form>';
  1. Mật khẩu băm - Luôn sử dụng bcrypt hoặc argon2 để băm mật khẩu
  2. Xác thực đầu vào - Xác thực và vệ sinh tất cả đầu vào của người dùng
  3. Kiểm tra quyền - Luôn xác minh quyền của người dùng trước khi hành động
  4. Sử dụng phiên một cách an toàn - Tạo lại ID phiên khi đăng nhập
  5. Ghi nhật ký hoạt động - Đăng nhập, đăng xuất và các hành động quan trọng
  6. Giới hạn tỷ lệ - Thực hiện giới hạn tỷ lệ đăng nhập
  7. Chỉ HTTPS - Luôn sử dụng HTTPS để xác thực
  8. Quản lý nhóm - Sử dụng nhóm để tổ chức quyền
  • ../Kernel/Kernel-Classes - Dịch vụ hạt nhân và khởi động
  • ../Database/QueryBuilder - Truy vấn cơ sở dữ liệu về dữ liệu người dùng
  • ../Core/XoopsObject - Đối tượng cơ sở class

Xem thêm: XOOPS Người dùng API | PHP Bảo mật