XOOPS Benutzer-System
Das XOOPS Benutzer-System verwaltet Benutzerkonten, Authentifizierung, Autorisierung, Gruppenmitgliedschaft und Session-Verwaltung. Es bietet ein robustes Framework zum Sichern Ihrer Anwendung und zur Steuerung des Benutzerzugriffs.
Benutzer-System-Architektur
Abschnitt betitelt „Benutzer-System-Architektur“graph TD A[Benutzer-System] -->|verwaltet| B[XoopsUser] A -->|verwaltet| C[XoopsGroup] A -->|handhabt| D[Authentifizierung] A -->|handhabt| E[Sessions]
D -->|validiert| F[Benutzername/Passwort] D -->|validiert| G[E-Mail/Token] D -->|triggert| H[Post-Login-Hooks]
E -->|verwaltet| I[Session-Daten] E -->|verwaltet| J[Session-Cookies]
B -->|gehört zu| C B -->|hat| K[Berechtigungen] B -->|hat| L[Profildaten]
C -->|definiert| M[Zugriffsebenen] C -->|enthält| N[Mehrere Benutzer]XoopsUser Klasse
Abschnitt betitelt „XoopsUser Klasse“Die hauptsächliche Benutzerobjekt-Klasse, die ein Benutzerkonto darstellt.
Klassenübersicht
Abschnitt betitelt „Klassenübersicht“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
Abschnitt betitelt „Konstruktor“public function __construct(int $uid = null)Erstellt ein neues Benutzerobjekt und lädt optional aus der Datenbank nach ID.
Parameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$uid | int | Zu ladende Benutzer-ID (optional) |
Beispiel:
// Neuen Benutzer erstellen$user = new XoopsUser();
// Vorhandenen Benutzer laden$user = new XoopsUser(123);Kern-Eigenschaften
Abschnitt betitelt „Kern-Eigenschaften“| Eigenschaft | Typ | Beschreibung |
|---|---|---|
uid | int | Benutzer-ID |
uname | string | Benutzername |
email | string | E-Mail-Adresse |
pass | string | Passwort-Hash |
uregdate | int | Registierungs-Zeitstempel |
ulevel | int | Benutzer-Level (9=admin, 1=user) |
groups | array | Gruppen-IDs |
permissions | array | Berechtigungsflags |
Kern-Methoden
Abschnitt betitelt „Kern-Methoden“getID / getUid
Abschnitt betitelt „getID / getUid“Ruft die Benutzer-ID ab.
public function getID(): intpublic function getUid(): int // AliasRückgabewert: int - Benutzer-ID
Beispiel:
$user = new XoopsUser(1);echo $user->getID(); // 1echo $user->getUid(); // 1getUnameReal
Abschnitt betitelt „getUnameReal“Ruft den Anzeigenamen des Benutzers ab.
public function getUnameReal(): stringRückgabewert: string - Echter Name des Benutzers
Beispiel:
$realName = $user->getUnameReal();echo "Hallo, $realName";getEmail
Abschnitt betitelt „getEmail“Ruft die E-Mail-Adresse des Benutzers ab.
public function getEmail(): stringRückgabewert: string - E-Mail-Adresse
Beispiel:
$email = $user->getEmail();mail($email, 'Welcome', 'Willkommen bei XOOPS');getVar / setVar
Abschnitt betitelt „getVar / setVar“Ruft eine Benutzervariable ab oder setzt sie.
public function getVar(string $key, string $format = 's'): mixedpublic function setVar(string $key, mixed $value, bool $notGpc = false): boolBeispiel:
// Werte abrufen$username = $user->getVar('uname');$email = $user->getVar('email', 's'); // Formatiert für Anzeige
// Werte setzen$user->setVar('uname', 'newusername');$user->setVar('email', 'user@example.com');getGroups
Abschnitt betitelt „getGroups“Ruft die Gruppenmitgliedschaften des Benutzers ab.
public function getGroups(): arrayRückgabewert: array - Array von Gruppen-IDs
Beispiel:
$groups = $user->getGroups();echo "Mitglied von " . count($groups) . " Gruppen";isInGroup
Abschnitt betitelt „isInGroup“Prüft, ob der Benutzer einer Gruppe angehört.
public function isInGroup(int $groupId): boolParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$groupId | int | Zu prüfende Gruppen-ID |
Rückgabewert: bool - True wenn in Gruppe
Beispiel:
if ($user->isInGroup(1)) { // 1 = Webmasters echo 'Benutzer ist ein Webmaster';}isAdmin
Abschnitt betitelt „isAdmin“Prüft, ob der Benutzer ein Administrator ist.
public function isAdmin(): boolRückgabewert: bool - True wenn Admin
Beispiel:
if ($user->isAdmin()) { // Admin-Steuerelemente anzeigen echo '<a href="admin/">Admin-Panel</a>';}getProfile
Abschnitt betitelt „getProfile“Ruft die Profilinformationen des Benutzers ab.
public function getProfile(): arrayRückgabewert: array - Profildaten
Beispiel:
$profile = $user->getProfile();echo 'Bio: ' . $profile['bio'];isActive
Abschnitt betitelt „isActive“Prüft, ob das Benutzerkonto aktiv ist.
public function isActive(): boolRückgabewert: bool - True wenn aktiv
Beispiel:
if ($user->isActive()) { // Benutzerzugriff erlauben} else { // Zugriff einschränken}updateLastLogin
Abschnitt betitelt „updateLastLogin“Aktualisiert den Zeitstempel der letzten Anmeldung des Benutzers.
public function updateLastLogin(): boolRückgabewert: bool - True bei Erfolg
Beispiel:
if ($user->updateLastLogin()) { echo 'Login aufgezeichnet';}XoopsGroup Klasse
Abschnitt betitelt „XoopsGroup Klasse“Verwaltet Benutzergruppen und Berechtigungen.
Klassenübersicht
Abschnitt betitelt „Klassenübersicht“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 = [];}Konstanten
Abschnitt betitelt „Konstanten“| Konstante | Wert | Beschreibung |
|---|---|---|
TYPE_NORMAL | 0 | Normale Benutzergruppe |
TYPE_ADMIN | 1 | Administrative Gruppe |
TYPE_SYSTEM | 2 | Systemgruppe |
Methoden
Abschnitt betitelt „Methoden“getName
Abschnitt betitelt „getName“Ruft den Gruppennamen ab.
public function getName(): stringRückgabewert: string - Gruppenname
Beispiel:
$group = new XoopsGroup(1);echo $group->getName(); // "Webmasters"getDescription
Abschnitt betitelt „getDescription“Ruft die Gruppenbeschreibung ab.
public function getDescription(): stringRückgabewert: string - Beschreibung
Beispiel:
echo $group->getDescription();getUsers
Abschnitt betitelt „getUsers“Ruft Gruppenmitglieder ab.
public function getUsers(): arrayRückgabewert: array - Array von Benutzer-IDs
Beispiel:
$users = $group->getUsers();echo "Gruppe hat " . count($users) . " Mitglieder";addUser
Abschnitt betitelt „addUser“Fügt einen Benutzer zur Gruppe hinzu.
public function addUser(int $uid): boolParameter:
| Parameter | Typ | Beschreibung |
|---|---|---|
$uid | int | Benutzer-ID |
Rückgabewert: bool - True bei Erfolg
Beispiel:
$group = new XoopsGroup(2); // Editors$group->addUser(123);$groupHandler->insert($group);removeUser
Abschnitt betitelt „removeUser“Entfernt einen Benutzer aus der Gruppe.
public function removeUser(int $uid): boolBeispiel:
$group->removeUser(123);Benutzer-Authentifizierung
Abschnitt betitelt „Benutzer-Authentifizierung“Anmeldeprozess
Abschnitt betitelt „Anmeldeprozess“/** * Benutzer-Anmeldung */function xoops_user_login(string $uname, string $pass, bool $rememberMe = false): ?XoopsUser{ global $xoopsDB;
// Benutzernamen bereinigen $uname = trim($uname);
// Benutzer aus Datenbank abrufen $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; // Benutzer nicht gefunden }
$row = $result->fetch_assoc();
// Passwort verifizieren if (!password_verify($pass, $row['pass'])) { return null; // Ungültiges Passwort }
// Benutzerobjekt laden $user = new XoopsUser($row['uid']);
// Letzte Anmeldung aktualisieren $user->updateLastLogin();
// "Remember Me" behandeln if ($rememberMe) { // Persistentes Cookie setzen setcookie( 'xoops_user_remember', $user->uid(), time() + (30 * 24 * 60 * 60), // 30 Tage '/', $_SERVER['HTTP_HOST'] ?? '' ); }
return $user;}Passwort-Verwaltung
Abschnitt betitelt „Passwort-Verwaltung“/** * Passwort sicher hashen */function xoops_hash_password(string $password): string{ return password_hash($password, PASSWORD_BCRYPT, [ 'cost' => 12 ]);}
/** * Passwort verifizieren */function xoops_verify_password(string $password, string $hash): bool{ return password_verify($password, $hash);}
/** * Prüfen ob Passwort neu gehashed werden muss */function xoops_password_needs_rehash(string $hash): bool{ return password_needs_rehash($hash, PASSWORD_BCRYPT, [ 'cost' => 12 ]);}Session-Verwaltung
Abschnitt betitelt „Session-Verwaltung“Session-Klasse
Abschnitt betitelt „Session-Klasse“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 {}}Session-Methoden
Abschnitt betitelt „Session-Methoden“Session starten
Abschnitt betitelt „Session starten“<?phpsession_start();
// Session-ID aus Sicherheitsgründen regenerierensession_regenerate_id(true);
// Session-Timeout setzenini_set('session.gc_maxlifetime', 3600); // 1 Stunde
// Benutzer in Session speichernif ($user) { $_SESSION['xoops_user'] = $user; $_SESSION['xoops_uid'] = $user->getID(); $_SESSION['xoops_uname'] = $user->getVar('uname');}Session prüfen
Abschnitt betitelt „Session prüfen“/** * Aktuellen Benutzer aus Session abrufen */function xoops_get_current_user(): ?XoopsUser{ if (isset($_SESSION['xoops_user']) && $_SESSION['xoops_user'] instanceof XoopsUser) { return $_SESSION['xoops_user']; } return null;}
/** * Prüfen ob Benutzer angemeldet ist */function xoops_is_user_logged_in(): bool{ return isset($_SESSION['xoops_uid']) && $_SESSION['xoops_uid'] > 0;}Session zerstören
Abschnitt betitelt „Session zerstören“/** * Benutzer-Abmeldung */function xoops_user_logout(){ global $xoopsUser;
// Abmeldung protokollieren if ($xoopsUser) { error_log('Benutzer ' . $xoopsUser->getVar('uname') . ' abgemeldet'); }
// Session-Daten löschen $_SESSION = [];
// Session-Cookie löschen 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 zerstören session_destroy();}Berechtigungssystem
Abschnitt betitelt „Berechtigungssystem“Berechtigungs-Konstanten
Abschnitt betitelt „Berechtigungs-Konstanten“| Konstante | Wert | Beschreibung |
|---|---|---|
XOOPS_PERMISSION_NONE | 0 | Keine Berechtigung |
XOOPS_PERMISSION_VIEW | 1 | Inhalt anzeigen |
XOOPS_PERMISSION_SUBMIT | 2 | Inhalt einreichen |
XOOPS_PERMISSION_EDIT | 4 | Inhalt bearbeiten |
XOOPS_PERMISSION_DELETE | 8 | Inhalt löschen |
XOOPS_PERMISSION_ADMIN | 16 | Admin-Zugriff |
Berechtigungsprüfung
Abschnitt betitelt „Berechtigungsprüfung“/** * Prüfen ob Benutzer Berechtigung hat */function xoops_check_permission($user, $resource, $permission){ if (!$user) { return false; }
// Admins haben alle Berechtigungen if ($user->isAdmin()) { return true; }
// Gruppenberechtigungen prüfen $groups = $user->getGroups(); foreach ($groups as $groupId) { if (xoops_group_has_permission($groupId, $resource, $permission)) { return true; } }
return false;}Benutzer-Handler
Abschnitt betitelt „Benutzer-Handler“Der UserHandler verwaltet Benutzer-Persistenzoperationen.
/** * Benutzer-Handler abrufen */$userHandler = xoops_getHandler('user');
/** * Neuen Benutzer erstellen */$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 'Benutzer erstellt mit ID: ' . $user->getID();}
/** * Benutzer aktualisieren */$user = $userHandler->get(123);$user->setVar('email', 'newemail@example.com');$userHandler->insert($user);
/** * Benutzer nach Name abrufen */$user = $userHandler->findByUsername('john');
/** * Benutzer löschen */$userHandler->delete($user);
/** * Benutzer durchsuchen */$criteria = new CriteriaCompo();$criteria->add(new Criteria('uname', '%admin%', 'LIKE'));$users = $userHandler->getObjects($criteria);Vollständiges Beispiel für Benutzerverwaltung
Abschnitt betitelt „Vollständiges Beispiel für Benutzerverwaltung“<?php/** * Vollständiges Beispiel für Benutzer-Authentifizierung und Profil */
require_once XOOPS_ROOT_PATH . '/include/common.inc.php';
$xoopsUser = $GLOBALS['xoopsUser'];
// Prüfen ob Benutzer angemeldet istif (!$xoopsUser || !$xoopsUser->isActive()) { redirect_header(XOOPS_URL, 3, 'Bitte anmelden');}
// Benutzer-Handler abrufen$userHandler = xoops_getHandler('user');
// Aktuellen Benutzer mit frischen Daten abrufen$currentUser = $userHandler->get($xoopsUser->getID());
// Benutzer-Profilseiteecho '<h1>Profil: ' . htmlspecialchars($currentUser->getVar('uname')) . '</h1>';
echo '<div class="user-profile">';echo '<p><strong>Benutzername:</strong> ' . htmlspecialchars($currentUser->getVar('uname')) . '</p>';echo '<p><strong>E-Mail:</strong> ' . htmlspecialchars($currentUser->getVar('email')) . '</p>';echo '<p><strong>Registriert:</strong> ' . date('Y-m-d H:i:s', $currentUser->getVar('uregdate')) . '</p>';echo '<p><strong>Gruppen:</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>';
// Passwort-Änderungsformularif ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['change_password'])) { $oldPassword = $_POST['old_password'] ?? ''; $newPassword = $_POST['new_password'] ?? ''; $confirmPassword = $_POST['confirm_password'] ?? '';
// Altes Passwort verifizieren if (!password_verify($oldPassword, $currentUser->getVar('pass'))) { echo '<div class="error">Aktuelles Passwort ist falsch</div>'; } elseif ($newPassword !== $confirmPassword) { echo '<div class="error">Neue Passwörter stimmen nicht überein</div>'; } elseif (strlen($newPassword) < 6) { echo '<div class="error">Passwort muss mindestens 6 Zeichen lang sein</div>'; } else { // Passwort aktualisieren $currentUser->setVar('pass', xoops_hash_password($newPassword)); if ($userHandler->insert($currentUser)) { echo '<div class="success">Passwort erfolgreich geändert</div>'; } else { echo '<div class="error">Fehler beim Aktualisieren des Passworts</div>'; } }}
// Passwort-Änderungsformularecho '<form method="post">';echo '<h3>Passwort ändern</h3>';echo '<div class="form-group">';echo '<label>Aktuelles Passwort:</label>';echo '<input type="password" name="old_password" required>';echo '</div>';echo '<div class="form-group">';echo '<label>Neues Passwort:</label>';echo '<input type="password" name="new_password" required>';echo '</div>';echo '<div class="form-group">';echo '<label>Passwort bestätigen:</label>';echo '<input type="password" name="confirm_password" required>';echo '</div>';echo '<button type="submit" name="change_password">Passwort ändern</button>';echo '</form>';Best Practices
Abschnitt betitelt „Best Practices“- Passwörter hashen - Immer bcrypt oder argon2 für Passwort-Hashing verwenden
- Eingabe validieren - Alle Benutzereingaben validieren und bereinigen
- Berechtigungen prüfen - Immer Benutzerberechtigungen vor Aktionen überprüfen
- Sessions sicher nutzen - Session-IDs bei der Anmeldung regenerieren
- Aktivitäten protokollieren - Anmeldungen, Abmeldungen und kritische Aktionen protokollieren
- Rate Limiting - Login-Versuch-Rate Limiting implementieren
- HTTPS nur - Immer HTTPS für Authentifizierung verwenden
- Gruppenverwaltung - Gruppen zur Berechtigungsorganisation nutzen
Zugehörige Dokumentation
Abschnitt betitelt „Zugehörige Dokumentation“- ../Kernel/Kernel-Classes - Kernel-Services und Bootstrapping
- ../Database/QueryBuilder - Datenbankabfragen für Benutzerdaten
- ../Core/XoopsObject - Basis-Objektklasse
Siehe auch: XOOPS User API | PHP Security