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]XoopsUser שיעור
Section titled “XoopsUser שיעור”מחלקת אובייקט המשתמש הראשי המייצגת חשבון משתמש.
סקירת כיתה
Section titled “סקירת כיתה”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 = [];}קונסטרוקטור
Section titled “קונסטרוקטור”public function __construct(int $uid = null)יוצר אובייקט משתמש חדש, אופציונלי לטעון ממסד הנתונים לפי מזהה.
פרמטרים:
| פרמטר | הקלד | תיאור |
|---|---|---|
$uid | int | מזהה משתמש לטעינה (אופציונלי) |
דוּגמָה:
// Create new user$user = new XoopsUser();
// Load existing user$user = new XoopsUser(123);מאפייני ליבה
Section titled “מאפייני ליבה”| נכס | הקלד | תיאור |
|---|---|---|
uid | int | מזהה משתמש |
uname | מחרוזת | שם משתמש |
email | מחרוזת | כתובת דואר אלקטרוני |
pass | מחרוזת | סיסמא hash |
uregdate | int | חותמת זמן רישום |
ulevel | int | רמת משתמש (9=מנהל, 1=משתמש) |
groups | מערך | מזהי קבוצה |
permissions | מערך | דגלי הרשאה |
שיטות ליבה
Section titled “שיטות ליבה”getID / getUid
Section titled “getID / getUid”מקבל את תעודת הזהות של המשתמש.
public function getID(): intpublic function getUid(): int // Aliasהחזרות: int - מזהה משתמש
דוגמה:
$user = new XoopsUser(1);echo $user->getID(); // 1echo $user->getUid(); // 1getUnameReal
Section titled “getUnameReal”מקבל את שם התצוגה של המשתמש.
public function getUnameReal(): stringהחזרות: string - השם האמיתי של המשתמש
דוגמה:
$realName = $user->getUnameReal();echo "Hello, $realName";getEmail
Section titled “getEmail”מקבל את כתובת האימייל של המשתמש.
public function getEmail(): stringהחזרות: string - כתובת אימייל
דוגמה:
$email = $user->getEmail();mail($email, 'Welcome', 'Welcome to XOOPS');getVar / setVar
Section titled “getVar / setVar”מקבל או מגדיר משתנה משתמש.
public function getVar(string $key, string $format = 's'): mixedpublic 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');getGroups
Section titled “getGroups”מקבל את החברות בקבוצה של המשתמש.
public function getGroups(): arrayהחזרות: array - מערך מזהי קבוצה
דוגמה:
$groups = $user->getGroups();echo "Member of " . count($groups) . " groups";הוא בקבוצה
Section titled “הוא בקבוצה”בודק אם המשתמש שייך לקבוצה.
public function isInGroup(int $groupId): boolפרמטרים:
| פרמטר | הקלד | תיאור |
|---|---|---|
$groupId | int | מזהה קבוצה לבדיקה |
החזרות: bool - נכון אם בקבוצה
דוגמה:
if ($user->isInGroup(1)) { // 1 = Webmasters echo 'User is a webmaster';}הוא אדמין
Section titled “הוא אדמין”בודק אם המשתמש הוא מנהל מערכת.
public function isAdmin(): boolמחזירות: bool - נכון אם מנהל
דוגמה:
if ($user->isAdmin()) { // Show admin controls echo '<a href="admin/">Admin Panel</a>';}getProfile
Section titled “getProfile”מקבל מידע על פרופיל משתמש.
public function getProfile(): arrayהחזרות: array - נתוני פרופיל
דוגמה:
$profile = $user->getProfile();echo 'Bio: ' . $profile['bio'];הוא פעיל
Section titled “הוא פעיל”בודק אם חשבון המשתמש פעיל.
public function isActive(): boolהחזרות: bool - נכון אם פעיל
דוגמה:
if ($user->isActive()) { // Allow user access} else { // Restrict access}updateLastLogin
Section titled “updateLastLogin”מעדכן את חותמת הכניסה האחרונה של המשתמש.
public function updateLastLogin(): boolהחזרות: bool - נכון לגבי הצלחה
דוגמה:
if ($user->updateLastLogin()) { echo 'Login recorded';}XoopsGroup שיעור
Section titled “XoopsGroup שיעור”מנהל קבוצות משתמשים והרשאות.
סקירת כיתה
Section titled “סקירת כיתה”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 = [];}קבועים
Section titled “קבועים”| קבוע | ערך | תיאור |
|---|---|---|
TYPE_NORMAL | 0 | קבוצת משתמשים רגילה |
TYPE_ADMIN | 1 | קבוצה מנהלית |
TYPE_SYSTEM | 2 | קבוצת מערכת |
getName
Section titled “getName”מקבל את שם הקבוצה.
public function getName(): stringהחזרות: string - שם הקבוצה
דוגמה:
$group = new XoopsGroup(1);echo $group->getName(); // "Webmasters"getDescription
Section titled “getDescription”מקבל את תיאור הקבוצה.
public function getDescription(): stringהחזרות: string - תיאור
דוגמה:
echo $group->getDescription();getUsers
Section titled “getUsers”מקבל חברי קבוצה.
public function getUsers(): arrayהחזרות: array - מערך מזהי משתמש
דוגמה:
$users = $group->getUsers();echo "Group has " . count($users) . " members";addUser
Section titled “addUser”מוסיף משתמש לקבוצה.
public function addUser(int $uid): boolפרמטרים:
| פרמטר | הקלד | תיאור |
|---|---|---|
$uid | int | מזהה משתמש |
החזרות: bool - נכון לגבי הצלחה
דוגמה:
$group = new XoopsGroup(2); // Editors$group->addUser(123);$groupHandler->insert($group);הסר משתמש
Section titled “הסר משתמש”מסיר משתמש מהקבוצה.
public function removeUser(int $uid): boolדוּגמָה:
$group->removeUser(123);אימות משתמש
Section titled “אימות משתמש”תהליך התחברות
Section titled “תהליך התחברות”/** * 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;}ניהול סיסמאות
Section titled “ניהול סיסמאות”/** * 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 ]);}ניהול מפגשים
Section titled “ניהול מפגשים”שיעור מושב
Section titled “שיעור מושב”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 {}}שיטות הפעלה
Section titled “שיטות הפעלה”התחל הפעלה
Section titled “התחל הפעלה”<?phpsession_start();
// Regenerate session ID for securitysession_regenerate_id(true);
// Set session timeoutini_set('session.gc_maxlifetime', 3600); // 1 hour
// Store user in sessionif ($user) { $_SESSION['xoops_user'] = $user; $_SESSION['xoops_uid'] = $user->getID(); $_SESSION['xoops_uname'] = $user->getVar('uname');}בדוק הפעלה
Section titled “בדוק הפעלה”/** * 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;}הרס סשן
Section titled “הרס סשן”/** * 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();}מערכת הרשאות
Section titled “מערכת הרשאות”קבועי הרשאה
Section titled “קבועי הרשאה”| קבוע | ערך | תיאור |
|---|---|---|
XOOPS_PERMISSION_NONE | 0 | אין רשות |
XOOPS_PERMISSION_VIEW | 1 | צפה בתוכן |
XOOPS_PERMISSION_SUBMIT | 2 | שלח תוכן |
XOOPS_PERMISSION_EDIT | 4 | ערוך תוכן |
XOOPS_PERMISSION_DELETE | 8 | מחק תוכן |
XOOPS_PERMISSION_ADMIN | 16 | גישת מנהל |
בדיקת הרשאות
Section titled “בדיקת הרשאות”/** * 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;}מטפל משתמש
Section titled “מטפל משתמש”ה-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 inif (!$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 pageecho '<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 statusif ($currentUser->isAdmin()) { echo '<p><strong>Status:</strong> Administrator</p>';}
echo '</div>';
// Change password formif ($_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 formecho '<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>';שיטות עבודה מומלצות
Section titled “שיטות עבודה מומלצות”- סיסמאות גיבוב - השתמש תמיד ב-bcrypt או argon2 ל-hash סיסמה
- אמת קלט - אמת וחיטוי כל קלט המשתמש
- בדוק הרשאות - אמת תמיד את הרשאות המשתמש לפני פעולות
- השתמש בהפעלות בצורה מאובטחת - צור מחדש מזהי הפעלה בעת הכניסה
- פעילויות יומן - התחברות, התנתקות ופעולות קריטיות
- הגבלת תעריף - יישם הגבלת שיעור ניסיונות הכניסה
- HTTPS בלבד - השתמש תמיד ב-HTTPS לאימות
- ניהול קבוצות - השתמש בקבוצות לארגון הרשאות
תיעוד קשור
Section titled “תיעוד קשור”- ../Kernel/Kernel-Classes - שירותי ליבה ו-bootstrapping
- ../Database/QueryBuilder - שאילתות מסד נתונים עבור נתוני משתמשים
- ../Core/XoopsObject - מחלקת אובייקט בסיס
ראה גם: XOOPS משתמש API | PHP אבטחה