דלגו לתוכן

XOOPS מערכת משתמש

מערכת המשתמש XOOPS מנהלת חשבונות משתמש, אימות, הרשאות, חברות בקבוצה וניהול הפעלה. הוא מספק מסגרת חזקה לאבטחת האפליקציה שלך ושליטה בגישה למשתמשים.

ארכיטקטורת מערכת משתמש

Section titled “ארכיטקטורת מערכת משתמש”
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]

מחלקת אובייקט המשתמש הראשי המייצגת חשבון משתמש.

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)

יוצר אובייקט משתמש חדש, אופציונלי לטעון ממסד הנתונים לפי מזהה.

פרמטרים:

פרמטרהקלדתיאור
$uidintמזהה משתמש לטעינה (אופציונלי)

דוּגמָה:

// Create new user
$user = new XoopsUser();
// Load existing user
$user = new XoopsUser(123);
נכסהקלדתיאור
uidintמזהה משתמש
unameמחרוזתשם משתמש
emailמחרוזתכתובת דואר אלקטרוני
passמחרוזתסיסמא hash
uregdateintחותמת זמן רישום
ulevelintרמת משתמש (9=מנהל, 1=משתמש)
groupsמערךמזהי קבוצה
permissionsמערךדגלי הרשאה

מקבל את תעודת הזהות של המשתמש.

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

החזרות: int - מזהה משתמש

דוגמה:

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

מקבל את שם התצוגה של המשתמש.

public function getUnameReal(): string

החזרות: string - השם האמיתי של המשתמש

דוגמה:

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

מקבל את כתובת האימייל של המשתמש.

public function getEmail(): string

החזרות: string - כתובת אימייל

דוגמה:

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

מקבל או מגדיר משתנה משתמש.

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

דוּגמָה:

// 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');

מקבל את החברות בקבוצה של המשתמש.

public function getGroups(): array

החזרות: array - מערך מזהי קבוצה

דוגמה:

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

בודק אם המשתמש שייך לקבוצה.

public function isInGroup(int $groupId): bool

פרמטרים:

פרמטרהקלדתיאור
$groupIdintמזהה קבוצה לבדיקה

החזרות: bool - נכון אם בקבוצה

דוגמה:

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

בודק אם המשתמש הוא מנהל מערכת.

public function isAdmin(): bool

מחזירות: bool - נכון אם מנהל

דוגמה:

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

מקבל מידע על פרופיל משתמש.

public function getProfile(): array

החזרות: array - נתוני פרופיל

דוגמה:

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

בודק אם חשבון המשתמש פעיל.

public function isActive(): bool

החזרות: bool - נכון אם פעיל

דוגמה:

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

מעדכן את חותמת הכניסה האחרונה של המשתמש.

public function updateLastLogin(): bool

החזרות: bool - נכון לגבי הצלחה

דוגמה:

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

מנהל קבוצות משתמשים והרשאות.

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 = [];
}
קבועערךתיאור
TYPE_NORMAL0קבוצת משתמשים רגילה
TYPE_ADMIN1קבוצה מנהלית
TYPE_SYSTEM2קבוצת מערכת

מקבל את שם הקבוצה.

public function getName(): string

החזרות: string - שם הקבוצה

דוגמה:

$group = new XoopsGroup(1);
echo $group->getName(); // "Webmasters"

מקבל את תיאור הקבוצה.

public function getDescription(): string

החזרות: string - תיאור

דוגמה:

echo $group->getDescription();

מקבל חברי קבוצה.

public function getUsers(): array

החזרות: array - מערך מזהי משתמש

דוגמה:

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

מוסיף משתמש לקבוצה.

public function addUser(int $uid): bool

פרמטרים:

פרמטרהקלדתיאור
$uidintמזהה משתמש

החזרות: bool - נכון לגבי הצלחה

דוגמה:

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

מסיר משתמש מהקבוצה.

public function removeUser(int $uid): bool

דוּגמָה:

$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();
}
קבועערךתיאור
XOOPS_PERMISSION_NONE0אין רשות
XOOPS_PERMISSION_VIEW1צפה בתוכן
XOOPS_PERMISSION_SUBMIT2שלח תוכן
XOOPS_PERMISSION_EDIT4ערוך תוכן
XOOPS_PERMISSION_DELETE8מחק תוכן
XOOPS_PERMISSION_ADMIN16גישת מנהל
/**
* 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 מנהל את פעולות ההתמדה של המשתמש.

/**
* 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);

דוגמה מלאה לניהול משתמשים

Section titled “דוגמה מלאה לניהול משתמשים”
<?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. סיסמאות גיבוב - השתמש תמיד ב-bcrypt או argon2 ל-hash סיסמה
  2. אמת קלט - אמת וחיטוי כל קלט המשתמש
  3. בדוק הרשאות - אמת תמיד את הרשאות המשתמש לפני פעולות
  4. השתמש בהפעלות בצורה מאובטחת - צור מחדש מזהי הפעלה בעת הכניסה
  5. פעילויות יומן - התחברות, התנתקות ופעולות קריטיות
  6. הגבלת תעריף - יישם הגבלת שיעור ניסיונות הכניסה
  7. HTTPS בלבד - השתמש תמיד ב-HTTPS לאימות
  8. ניהול קבוצות - השתמש בקבוצות לארגון הרשאות
  • ../Kernel/Kernel-Classes - שירותי ליבה ו-bootstrapping
  • ../Database/QueryBuilder - שאילתות מסד נתונים עבור נתוני משתמשים
  • ../Core/XoopsObject - מחלקת אובייקט בסיס

ראה גם: XOOPS משתמש API | PHP אבטחה