نظام مستخدمي 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 | معرف المستخدم المراد تحميله (اختياري) |
مثال:
// إنشاء مستخدم جديد$user = new XoopsUser();
// تحميل مستخدم موجود$user = new XoopsUser(123);الخصائص الأساسية
Section titled “الخصائص الأساسية”| الخاصية | النوع | الوصف |
|---|---|---|
uid | int | معرف المستخدم |
uname | string | اسم المستخدم |
email | string | عنوان البريد الإلكتروني |
pass | string | تجزئة كلمة المرور |
uregdate | int | طابع زمني للتسجيل |
ulevel | int | مستوى المستخدم (9=مسؤول، 1=مستخدم) |
groups | array | معرّفات المجموعات |
permissions | array | علامات الأذونات |
الدوال الأساسية
Section titled “الدوال الأساسية”getID / getUid
Section titled “getID / getUid”الحصول على معرف المستخدم.
public function getID(): intpublic function getUid(): int // اسم مستعاريعيد: int - معرف المستخدم
مثال:
$user = new XoopsUser(1);echo $user->getID(); // 1echo $user->getUid(); // 1getUnameReal
Section titled “getUnameReal”الحصول على اسم عرض المستخدم.
public function getUnameReal(): stringيعيد: string - الاسم الحقيقي للمستخدم
مثال:
$realName = $user->getUnameReal();echo "مرحبا، $realName";getEmail
Section titled “getEmail”الحصول على عنوان بريد المستخدم الإلكتروني.
public function getEmail(): stringيعيد: string - عنوان البريد الإلكتروني
مثال:
$email = $user->getEmail();mail($email, 'مرحبا', 'مرحبا بك في 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مثال:
// الحصول على القيم$username = $user->getVar('uname');$email = $user->getVar('email', 's'); // منسق للعرض
// تعيين القيم$user->setVar('uname', 'اسم_مستخدم_جديد');$user->setVar('email', 'user@example.com');getGroups
Section titled “getGroups”الحصول على عضويات المجموعات الخاصة بالمستخدم.
public function getGroups(): arrayيعيد: array - مصفوفة معرّفات المجموعات
مثال:
$groups = $user->getGroups();echo "عضو في " . count($groups) . " مجموعات";isInGroup
Section titled “isInGroup”التحقق من انتماء المستخدم لمجموعة.
public function isInGroup(int $groupId): boolالمعاملات:
| المعامل | النوع | الوصف |
|---|---|---|
$groupId | int | معرف المجموعة المراد التحقق منها |
يعيد: bool - صحيح إذا كان في المجموعة
مثال:
if ($user->isInGroup(1)) { // 1 = مديرو الويب echo 'المستخدم مدير ويب';}isAdmin
Section titled “isAdmin”التحقق من كون المستخدم مسؤولاً.
public function isAdmin(): boolيعيد: bool - صحيح إذا كان مسؤولاً
مثال:
if ($user->isAdmin()) { // إظهار عناصر التحكم في المسؤول echo '<a href="admin/">لوحة المسؤول</a>';}getProfile
Section titled “getProfile”الحصول على معلومات ملف تعريف المستخدم.
public function getProfile(): arrayيعيد: array - بيانات الملف الشخصي
مثال:
$profile = $user->getProfile();echo 'السيرة الذاتية: ' . $profile['bio'];isActive
Section titled “isActive”التحقق من حالة نشاط حساب المستخدم.
public function isActive(): boolيعيد: bool - صحيح إذا كان نشطًا
مثال:
if ($user->isActive()) { // السماح بوصول المستخدم} else { // تقييد الوصول}updateLastLogin
Section titled “updateLastLogin”تحديث طابع زمني آخر تسجيل دخول للمستخدم.
public function updateLastLogin(): boolيعيد: bool - صحيح عند النجاح
مثال:
if ($user->updateLastLogin()) { echo 'تم تسجيل الدخول';}فئة 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 | مجموعة نظامية |
الدوال
Section titled “الدوال”getName
Section titled “getName”الحصول على اسم المجموعة.
public function getName(): stringيعيد: string - اسم المجموعة
مثال:
$group = new XoopsGroup(1);echo $group->getName(); // "مديرو الويب"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 "المجموعة تحتوي على " . count($users) . " عضو";addUser
Section titled “addUser”إضافة مستخدم إلى المجموعة.
public function addUser(int $uid): boolالمعاملات:
| المعامل | النوع | الوصف |
|---|---|---|
$uid | int | معرف المستخدم |
يعيد: bool - صحيح عند النجاح
مثال:
$group = new XoopsGroup(2); // المحررون$group->addUser(123);$groupHandler->insert($group);removeUser
Section titled “removeUser”إزالة مستخدم من المجموعة.
public function removeUser(int $uid): boolمثال:
$group->removeUser(123);مصادقة المستخدم
Section titled “مصادقة المستخدم”عملية تسجيل الدخول
Section titled “عملية تسجيل الدخول”/** * تسجيل دخول المستخدم */function xoops_user_login(string $uname, string $pass, bool $rememberMe = false): ?XoopsUser{ global $xoopsDB;
// تطهير اسم المستخدم $uname = trim($uname);
// الحصول على المستخدم من قاعدة البيانات $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; // المستخدم غير موجود }
$row = $result->fetch_assoc();
// التحقق من كلمة المرور if (!password_verify($pass, $row['pass'])) { return null; // كلمة مرور غير صحيحة }
// تحميل كائن المستخدم $user = new XoopsUser($row['uid']);
// تحديث آخر تسجيل دخول $user->updateLastLogin();
// معالجة "تذكرني" if ($rememberMe) { // تعيين ملف تعريف ارتباط دائم setcookie( 'xoops_user_remember', $user->uid(), time() + (30 * 24 * 60 * 60), // 30 يومًا '/', $_SERVER['HTTP_HOST'] ?? '' ); }
return $user;}إدارة كلمات المرور
Section titled “إدارة كلمات المرور”/** * تجزئة كلمة المرور بشكل آمن */function xoops_hash_password(string $password): string{ return password_hash($password, PASSWORD_BCRYPT, [ 'cost' => 12 ]);}
/** * التحقق من كلمة المرور */function xoops_verify_password(string $password, string $hash): bool{ return password_verify($password, $hash);}
/** * التحقق من احتياج كلمة المرور إلى إعادة تجزئة */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();
// إعادة توليد معرف الجلسة للأمانsession_regenerate_id(true);
// تعيين انتهاء الجلسةini_set('session.gc_maxlifetime', 3600); // ساعة واحدة
// تخزين المستخدم في الجلسةif ($user) { $_SESSION['xoops_user'] = $user; $_SESSION['xoops_uid'] = $user->getID(); $_SESSION['xoops_uname'] = $user->getVar('uname');}التحقق من الجلسة
Section titled “التحقق من الجلسة”/** * الحصول على المستخدم الحالي من الجلسة */function xoops_get_current_user(): ?XoopsUser{ if (isset($_SESSION['xoops_user']) && $_SESSION['xoops_user'] instanceof XoopsUser) { return $_SESSION['xoops_user']; } return null;}
/** * التحقق من تسجيل دخول المستخدم */function xoops_is_user_logged_in(): bool{ return isset($_SESSION['xoops_uid']) && $_SESSION['xoops_uid'] > 0;}إنهاء الجلسة
Section titled “إنهاء الجلسة”/** * تسجيل خروج المستخدم */function xoops_user_logout(){ global $xoopsUser;
// تسجيل عملية الخروج if ($xoopsUser) { error_log('المستخدم ' . $xoopsUser->getVar('uname') . ' تم تسجيل خروجه'); }
// حذف بيانات الجلسة $_SESSION = [];
// حذف ملف تعريف ارتباط الجلسة if (ini_get('session.use_cookies')) { $params = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly'] ); }
// إنهاء الجلسة 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 “التحقق من الأذونات”/** * التحقق من وجود أذونات المستخدم */function xoops_check_permission($user, $resource, $permission){ if (!$user) { return false; }
// المسؤولون لديهم جميع الأذونات if ($user->isAdmin()) { return true; }
// التحقق من أذونات المجموعة $groups = $user->getGroups(); foreach ($groups as $groupId) { if (xoops_group_has_permission($groupId, $resource, $permission)) { return true; } }
return false;}معالج المستخدم
Section titled “معالج المستخدم”معالج المستخدم يدير عمليات إدارة جودة البيانات للمستخدم.
/** * الحصول على معالج المستخدم */$userHandler = xoops_getHandler('user');
/** * إنشاء مستخدم جديد */$user = new XoopsUser();$user->setVar('uname', 'مستخدم_جديد');$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->getID();}
/** * تحديث المستخدم */$user = $userHandler->get(123);$user->setVar('email', 'newemail@example.com');$userHandler->insert($user);
/** * الحصول على مستخدم باسم المستخدم */$user = $userHandler->findByUsername('john');
/** * حذف المستخدم */$userHandler->delete($user);
/** * البحث عن المستخدمين */$criteria = new CriteriaCompo();$criteria->add(new Criteria('uname', '%admin%', 'LIKE'));$users = $userHandler->getObjects($criteria);مثال شامل لإدارة المستخدمين
Section titled “مثال شامل لإدارة المستخدمين”<?php/** * مثال شامل للمصادقة والملف الشخصي */
require_once XOOPS_ROOT_PATH . '/include/common.inc.php';
$xoopsUser = $GLOBALS['xoopsUser'];
// التحقق من تسجيل دخول المستخدمif (!$xoopsUser || !$xoopsUser->isActive()) { redirect_header(XOOPS_URL, 3, 'يرجى تسجيل الدخول');}
// الحصول على معالج المستخدم$userHandler = xoops_getHandler('user');
// الحصول على المستخدم الحالي ببيانات جديدة$currentUser = $userHandler->get($xoopsUser->getID());
// صفحة ملف المستخدم الشخصيecho '<h1>الملف الشخصي: ' . htmlspecialchars($currentUser->getVar('uname')) . '</h1>';
echo '<div class="user-profile">';echo '<p><strong>اسم المستخدم:</strong> ' . htmlspecialchars($currentUser->getVar('uname')) . '</p>';echo '<p><strong>البريد الإلكتروني:</strong> ' . htmlspecialchars($currentUser->getVar('email')) . '</p>';echo '<p><strong>تم التسجيل:</strong> ' . date('Y-m-d H:i:s', $currentUser->getVar('uregdate')) . '</p>';echo '<p><strong>المجموعات:</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>';
// حالة المسؤولif ($currentUser->isAdmin()) { echo '<p><strong>الحالة:</strong> مسؤول</p>';}
echo '</div>';
// نموذج تغيير كلمة المرورif ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['change_password'])) { $oldPassword = $_POST['old_password'] ?? ''; $newPassword = $_POST['new_password'] ?? ''; $confirmPassword = $_POST['confirm_password'] ?? '';
// التحقق من كلمة المرور القديمة if (!password_verify($oldPassword, $currentUser->getVar('pass'))) { echo '<div class="error">كلمة المرور الحالية غير صحيحة</div>'; } elseif ($newPassword !== $confirmPassword) { echo '<div class="error">كلمات المرور الجديدة غير متطابقة</div>'; } elseif (strlen($newPassword) < 6) { echo '<div class="error">يجب أن تكون كلمة المرور 6 أحرف على الأقل</div>'; } else { // تحديث كلمة المرور $currentUser->setVar('pass', xoops_hash_password($newPassword)); if ($userHandler->insert($currentUser)) { echo '<div class="success">تم تغيير كلمة المرور بنجاح</div>'; } else { echo '<div class="error">فشل في تحديث كلمة المرور</div>'; } }}
// نموذج تغيير كلمة المرورecho '<form method="post">';echo '<h3>تغيير كلمة المرور</h3>';echo '<div class="form-group">';echo '<label>كلمة المرور الحالية:</label>';echo '<input type="password" name="old_password" required>';echo '</div>';echo '<div class="form-group">';echo '<label>كلمة المرور الجديدة:</label>';echo '<input type="password" name="new_password" required>';echo '</div>';echo '<div class="form-group">';echo '<label>تأكيد كلمة المرور:</label>';echo '<input type="password" name="confirm_password" required>';echo '</div>';echo '<button type="submit" name="change_password">تغيير كلمة المرور</button>';echo '</form>';أفضل الممارسات
Section titled “أفضل الممارسات”- تجزئة كلمات المرور - استخدم دائمًا bcrypt أو argon2 لتجزئة كلمات المرور
- التحقق من الإدخال - تحقق من صحة ورطهر جميع إدخالات المستخدم
- التحقق من الأذونات - تحقق دائمًا من أذونات المستخدم قبل الإجراءات
- استخدام الجلسات بأمان - أعد توليد معرفات الجلسات عند تسجيل الدخول
- سجل الأنشطة - سجل تسجيل الدخول والخروج والإجراءات الحرجة
- تحديد معدل المحاولات - طبق تحديد معدل محاولات تسجيل الدخول
- استخدم HTTPS فقط - استخدم دائمًا HTTPS للمصادقة
- إدارة المجموعات - استخدم المجموعات لتنظيم الأذونات
الوثائق ذات الصلة
Section titled “الوثائق ذات الصلة”- ../Kernel/Kernel-Classes - خدمات النواة والتمهيد
- ../Database/QueryBuilder - استعلامات قاعدة البيانات لبيانات المستخدم
- ../Core/XoopsObject - فئة الكائن الأساسي
انظر أيضًا: واجهة برمجة تطبيقات مستخدمي XOOPS | أمان PHP