System Użytkowników XOOPS
System Użytkowników XOOPS zarządza kontami użytkowników, uwierzytelnianiem, autoryzacją, członkostwem w grupach i zarządzaniem sesją. Zapewnia solidny framework do zabezpieczania aplikacji i kontrolowania dostępu użytkowników.
Architektura Systemu Użytkowników
Dział zatytułowany „Architektura Systemu Użytkowników”graph TD A[System Użytkowników] -->|manages| B[XoopsUser] A -->|manages| C[XoopsGroup] A -->|handles| D[Uwierzytelnianie] A -->|handles| E[Sesje]
D -->|validates| F[Nazwa Użytkownika/Hasło] D -->|validates| G[E-mail/Token] D -->|triggers| H[Haki Po-Login]
E -->|manages| I[Dane Sesji] E -->|manages| J[Ciasteczka Sesji]
B -->|belongs to| C B -->|has| K[Uprawnienia] B -->|has| L[Dane Profilu]
C -->|defines| M[Poziomy Dostępu] C -->|contains| N[Wielu Użytkowników]Klasa XoopsUser
Dział zatytułowany „Klasa XoopsUser”Główna klasa obiektu użytkownika reprezentująca konto użytkownika.
Class Overview
Dział zatytułowany „Class Overview”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 = [];}Konstruktor
Dział zatytułowany „Konstruktor”public function __construct(int $uid = null)Tworzy nowy obiekt użytkownika, opcjonalnie ładując z bazy danych po ID.
Parametry:
| Parametr | Typ | Opis |
|---|---|---|
$uid | int | ID użytkownika do załadowania (opcjonalnie) |
Przykład:
// Utwórz nowego użytkownika$user = new XoopsUser();
// Załaduj istniejącego użytkownika$user = new XoopsUser(123);Właściwości Podstawowe
Dział zatytułowany „Właściwości Podstawowe”| Właściwość | Typ | Opis |
|---|---|---|
uid | int | ID użytkownika |
uname | string | Nazwa użytkownika |
email | string | Adres e-mail |
pass | string | Hash hasła |
uregdate | int | Timestamp rejestracji |
ulevel | int | Poziom użytkownika (9=admin, 1=użytkownik) |
groups | array | ID grupy |
permissions | array | Flagi uprawnień |
Główne Metody
Dział zatytułowany „Główne Metody”getID / getUid
Dział zatytułowany „getID / getUid”Pobiera ID użytkownika.
public function getID(): intpublic function getUid(): int // AliasZwraca: int - ID użytkownika
Przykład:
$user = new XoopsUser(1);echo $user->getID(); // 1echo $user->getUid(); // 1getUnameReal
Dział zatytułowany „getUnameReal”Pobiera wyświetlaną nazwę użytkownika.
public function getUnameReal(): stringZwraca: string - Imię i nazwisko użytkownika
Przykład:
$realName = $user->getUnameReal();echo "Hello, $realName";getEmail
Dział zatytułowany „getEmail”Pobiera adres e-mail użytkownika.
public function getEmail(): stringZwraca: string - Adres e-mail
Przykład:
$email = $user->getEmail();mail($email, 'Welcome', 'Welcome to XOOPS');getVar / setVar
Dział zatytułowany „getVar / setVar”Pobiera lub ustawia zmienną użytkownika.
public function getVar(string $key, string $format = 's'): mixedpublic function setVar(string $key, mixed $value, bool $notGpc = false): boolPrzykład:
// Pobierz wartości$username = $user->getVar('uname');$email = $user->getVar('email', 's'); // Sformatowana do wyświetlenia
// Ustaw wartości$user->setVar('uname', 'newusername');$user->setVar('email', 'user@example.com');getGroups
Dział zatytułowany „getGroups”Pobiera członkostwo użytkownika w grupach.
public function getGroups(): arrayZwraca: array - Tablica ID grup
Przykład:
$groups = $user->getGroups();echo "Member of " . count($groups) . " groups";isInGroup
Dział zatytułowany „isInGroup”Sprawdza czy użytkownik należy do grupy.
public function isInGroup(int $groupId): boolParametry:
| Parametr | Typ | Opis |
|---|---|---|
$groupId | int | ID grupy do sprawdzenia |
Zwraca: bool - True jeśli w grupie
Przykład:
if ($user->isInGroup(1)) { // 1 = Webmasters echo 'User is a webmaster';}isAdmin
Dział zatytułowany „isAdmin”Sprawdza czy użytkownik jest administratorem.
public function isAdmin(): boolZwraca: bool - True jeśli admin
Przykład:
if ($user->isAdmin()) { // Pokaż kontrolki admin echo '<a href="admin/">Admin Panel</a>';}getProfile
Dział zatytułowany „getProfile”Pobiera informacje profilu użytkownika.
public function getProfile(): arrayZwraca: array - Dane profilu
Przykład:
$profile = $user->getProfile();echo 'Bio: ' . $profile['bio'];isActive
Dział zatytułowany „isActive”Sprawdza czy konto użytkownika jest aktywne.
public function isActive(): boolZwraca: bool - True jeśli aktywny
Przykład:
if ($user->isActive()) { // Zezwól na dostęp użytkownika} else { // Ogranicz dostęp}updateLastLogin
Dział zatytułowany „updateLastLogin”Aktualizuje timestamp ostatniego logowania użytkownika.
public function updateLastLogin(): boolZwraca: bool - True na sukces
Przykład:
if ($user->updateLastLogin()) { echo 'Login recorded';}Klasa XoopsGroup
Dział zatytułowany „Klasa XoopsGroup”Zarządza grupami użytkowników i uprawnieniami.
Przegląd Klasy
Dział zatytułowany „Przegląd Klasy”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 = [];}| Stała | Wartość | Opis |
|---|---|---|
TYPE_NORMAL | 0 | Normalna grupa użytkownika |
TYPE_ADMIN | 1 | Grupa administracyjna |
TYPE_SYSTEM | 2 | Grupa systemowa |
getName
Dział zatytułowany „getName”Pobiera nazwę grupy.
public function getName(): stringZwraca: string - Nazwa grupy
Przykład:
$group = new XoopsGroup(1);echo $group->getName(); // "Webmasters"getDescription
Dział zatytułowany „getDescription”Pobiera opis grupy.
public function getDescription(): stringZwraca: string - Opis
Przykład:
echo $group->getDescription();getUsers
Dział zatytułowany „getUsers”Pobiera członków grupy.
public function getUsers(): arrayZwraca: array - Tablica ID użytkowników
Przykład:
$users = $group->getUsers();echo "Group has " . count($users) . " members";addUser
Dział zatytułowany „addUser”Dodaje użytkownika do grupy.
public function addUser(int $uid): boolParametry:
| Parametr | Typ | Opis |
|---|---|---|
$uid | int | ID użytkownika |
Zwraca: bool - True na sukces
Przykład:
$group = new XoopsGroup(2); // Edytorzy$group->addUser(123);$groupHandler->insert($group);removeUser
Dział zatytułowany „removeUser”Usuwa użytkownika z grupy.
public function removeUser(int $uid): boolPrzykład:
$group->removeUser(123);Uwierzytelnianie Użytkownika
Dział zatytułowany „Uwierzytelnianie Użytkownika”Proces Logowania
Dział zatytułowany „Proces Logowania”/** * Login użytkownika */function xoops_user_login(string $uname, string $pass, bool $rememberMe = false): ?XoopsUser{ global $xoopsDB;
// Oczyść nazwę użytkownika $uname = trim($uname);
// Pobierz użytkownika z bazy danych $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; // Użytkownik nie znaleziony }
$row = $result->fetch_assoc();
// Weryfikuj hasło if (!password_verify($pass, $row['pass'])) { return null; // Nieprawidłowe hasło }
// Załaduj obiekt użytkownika $user = new XoopsUser($row['uid']);
// Zaktualizuj ostatnie logowanie $user->updateLastLogin();
// Obsługa "Remember Me" if ($rememberMe) { // Ustaw trwałe ciasteczko setcookie( 'xoops_user_remember', $user->uid(), time() + (30 * 24 * 60 * 60), // 30 dni '/', $_SERVER['HTTP_HOST'] ?? '' ); }
return $user;}Zarządzanie Hasłem
Dział zatytułowany „Zarządzanie Hasłem”/** * Hash hasła bezpiecznie */function xoops_hash_password(string $password): string{ return password_hash($password, PASSWORD_BCRYPT, [ 'cost' => 12 ]);}
/** * Weryfikuj hasło */function xoops_verify_password(string $password, string $hash): bool{ return password_verify($password, $hash);}
/** * Sprawdź czy hasło wymaga rehaszowania */function xoops_password_needs_rehash(string $hash): bool{ return password_needs_rehash($hash, PASSWORD_BCRYPT, [ 'cost' => 12 ]);}Zarządzanie Sesją
Dział zatytułowany „Zarządzanie Sesją”Klasa Sesji
Dział zatytułowany „Klasa Sesji”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 {}}Metody Sesji
Dział zatytułowany „Metody Sesji”Start Sesji
Dział zatytułowany „Start Sesji”<?phpsession_start();
// Regeneruj ID sesji dla bezpieczeństwasession_regenerate_id(true);
// Ustaw timeout sesjiini_set('session.gc_maxlifetime', 3600); // 1 godzina
// Przechowuj użytkownika w sesjiif ($user) { $_SESSION['xoops_user'] = $user; $_SESSION['xoops_uid'] = $user->getID(); $_SESSION['xoops_uname'] = $user->getVar('uname');}Sprawdź Sesję
Dział zatytułowany „Sprawdź Sesję”/** * Pobierz bieżącego użytkownika z sesji */function xoops_get_current_user(): ?XoopsUser{ if (isset($_SESSION['xoops_user']) && $_SESSION['xoops_user'] instanceof XoopsUser) { return $_SESSION['xoops_user']; } return null;}
/** * Sprawdź czy użytkownik jest zalogowany */function xoops_is_user_logged_in(): bool{ return isset($_SESSION['xoops_uid']) && $_SESSION['xoops_uid'] > 0;}Zniszcz Sesję
Dział zatytułowany „Zniszcz Sesję”/** * Wyloguj użytkownika */function xoops_user_logout(){ global $xoopsUser;
// Zaloguj wylogowanie if ($xoopsUser) { error_log('User ' . $xoopsUser->getVar('uname') . ' logged out'); }
// Zniszcz dane sesji $_SESSION = [];
// Usuń ciasteczko sesji if (ini_get('session.use_cookies')) { $params = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly'] ); }
// Zniszcz sesję session_destroy();}System Uprawnień
Dział zatytułowany „System Uprawnień”Stałe Uprawnień
Dział zatytułowany „Stałe Uprawnień”| Stała | Wartość | Opis |
|---|---|---|
XOOPS_PERMISSION_NONE | 0 | Brak uprawnień |
XOOPS_PERMISSION_VIEW | 1 | Wyświetl zawartość |
XOOPS_PERMISSION_SUBMIT | 2 | Prześlij zawartość |
XOOPS_PERMISSION_EDIT | 4 | Edytuj zawartość |
XOOPS_PERMISSION_DELETE | 8 | Usuń zawartość |
XOOPS_PERMISSION_ADMIN | 16 | Dostęp admin |
Sprawdzanie Uprawnień
Dział zatytułowany „Sprawdzanie Uprawnień”/** * Sprawdź czy użytkownik ma uprawnienia */function xoops_check_permission($user, $resource, $permission){ if (!$user) { return false; }
// Administratorzy mają wszystkie uprawnienia if ($user->isAdmin()) { return true; }
// Sprawdź uprawnienia grupy $groups = $user->getGroups(); foreach ($groups as $groupId) { if (xoops_group_has_permission($groupId, $resource, $permission)) { return true; } }
return false;}Handler Użytkownika
Dział zatytułowany „Handler Użytkownika”UserHandler zarządza operacjami trwałości użytkownika.
/** * Pobierz handler użytkownika */$userHandler = xoops_getHandler('user');
/** * Utwórz nowego użytkownika */$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();}
/** * Zaktualizuj użytkownika */$user = $userHandler->get(123);$user->setVar('email', 'newemail@example.com');$userHandler->insert($user);
/** * Pobierz użytkownika po nazwie */$user = $userHandler->findByUsername('john');
/** * Usuń użytkownika */$userHandler->delete($user);
/** * Szukaj użytkowników */$criteria = new CriteriaCompo();$criteria->add(new Criteria('uname', '%admin%', 'LIKE'));$users = $userHandler->getObjects($criteria);Kompletny Przykład Zarządzania Użytkownikami
Dział zatytułowany „Kompletny Przykład Zarządzania Użytkownikami”<?php/** * Kompletny przykład uwierzytelniania i profilu użytkownika */
require_once XOOPS_ROOT_PATH . '/include/common.inc.php';
$xoopsUser = $GLOBALS['xoopsUser'];
// Sprawdź czy użytkownik jest zalogowanyif (!$xoopsUser || !$xoopsUser->isActive()) { redirect_header(XOOPS_URL, 3, 'Please login');}
// Pobierz handler użytkownika$userHandler = xoops_getHandler('user');
// Pobierz bieżącego użytkownika ze świeżymi danymi$currentUser = $userHandler->get($xoopsUser->getID());
// Strona profilu użytkownikaecho '<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>';
// Status administratoraif ($currentUser->isAdmin()) { echo '<p><strong>Status:</strong> Administrator</p>';}
echo '</div>';
// Formularz zmiany hasłaif ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['change_password'])) { $oldPassword = $_POST['old_password'] ?? ''; $newPassword = $_POST['new_password'] ?? ''; $confirmPassword = $_POST['confirm_password'] ?? '';
// Weryfikuj stare hasło 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 { // Zaktualizuj hasło $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>'; } }}
// Formularz zmiany hasłaecho '<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>';Najlepsze Praktyki
Dział zatytułowany „Najlepsze Praktyki”- Hashuj Hasła - Zawsze używaj bcrypt lub argon2 do haszowania haseł
- Waliduj Wejście - Waliduj i oczyść wszystkie wejście użytkownika
- Sprawdzaj Uprawnienia - Zawsze weryfikuj uprawnienia użytkownika przed akcjami
- Bezpiecznie Używaj Sesji - Regeneruj ID sesji podczas logowania
- Loguj Aktywności - Loguj logowanie, wylogowanie i krytyczne akcje
- Rate Limiting - Implementuj limitowanie prób logowania
- Tylko HTTPS - Zawsze używaj HTTPS do uwierzytelniania
- Zarządzanie Grupami - Używaj grup do organizacji uprawnień
Powiązana Dokumentacja
Dział zatytułowany „Powiązana Dokumentacja”- ../Kernel/Kernel-Classes - Serwisy rdzenia i bootstrap
- ../Database/QueryBuilder - Zapytania do bazy danych dla danych użytkownika
- ../Core/XoopsObject - Klasa obiektu bazowego
Patrz też: API Użytkowników XOOPS | Bezpieczeństwo PHP