Lewati ke konten

Sistem Pengguna XOOPS

Sistem Pengguna XOOPS mengelola akun pengguna, otentikasi, otorisasi, keanggotaan grup, dan manajemen sesi. Ini memberikan kerangka kerja yang kuat untuk mengamankan aplikasi Anda dan mengendalikan akses pengguna.

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]

Kelas objek pengguna utama yang mewakili akun pengguna.

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)

Membuat objek pengguna baru, secara opsional memuat dari database berdasarkan ID.

Parameter:

ParameterKetikDeskripsi
$uidke dalamID Pengguna yang akan dimuat (opsional)

Contoh:

// Create new user
$user = new XoopsUser();
// Load existing user
$user = new XoopsUser(123);
PropertiKetikDeskripsi
uidke dalamID Pengguna
unametaliNama pengguna
emailtaliAlamat email
passtaliKata sandi hash
uregdateke dalamStempel waktu pendaftaran
ulevelke dalamTingkat pengguna (9=admin, 1=pengguna)
groupssusunanID Grup
permissionssusunanBendera izin

Mendapatkan ID pengguna.

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

Pengembalian: int - ID Pengguna

Contoh:

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

Mendapatkan nama tampilan pengguna.

public function getUnameReal(): string

Pengembalian: string - Nama asli pengguna

Contoh:

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

Mendapatkan alamat email pengguna.

public function getEmail(): string

Pengembalian: string - Alamat email

Contoh:

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

Mendapatkan atau menetapkan variabel pengguna.

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

Contoh:

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

Mendapatkan keanggotaan grup pengguna.

public function getGroups(): array

Pengembalian: array - Kumpulan ID grup

Contoh:

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

Memeriksa apakah pengguna termasuk dalam grup.

public function isInGroup(int $groupId): bool

Parameter:

ParameterKetikDeskripsi
$groupIdke dalamID Grup untuk diperiksa

Pengembalian: bool - Benar jika dalam grup

Contoh:

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

Memeriksa apakah pengguna adalah administrator.

public function isAdmin(): bool

Pengembalian: bool - Benar jika admin

Contoh:

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

Mendapatkan informasi profil pengguna.

public function getProfile(): array

Pengembalian: array - Data profil

Contoh:

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

Memeriksa apakah akun pengguna aktif.

public function isActive(): bool

Pengembalian: bool - Benar jika aktif

Contoh:

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

Memperbarui stempel waktu login terakhir pengguna.

public function updateLastLogin(): bool

Pengembalian: bool - Benar dalam kesuksesan

Contoh:

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

Mengelola grup pengguna dan izin.

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 = [];
}
KonstanNilaiDeskripsi
TYPE_NORMAL0Grup pengguna biasa
TYPE_ADMIN1Kelompok administratif
TYPE_SYSTEM2Grup sistem

Mendapatkan nama grup.

public function getName(): string

Pengembalian: string - Nama grup

Contoh:

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

Mendapatkan deskripsi grup.

public function getDescription(): string

Pengembalian: string - Deskripsi

Contoh:

echo $group->getDescription();

Mendapatkan anggota grup.

public function getUsers(): array

Pengembalian: array - Kumpulan ID pengguna

Contoh:

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

Menambahkan pengguna ke grup.

public function addUser(int $uid): bool

Parameter:

ParameterKetikDeskripsi
$uidke dalamID Pengguna

Pengembalian: bool - Benar dalam kesuksesan

Contoh:

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

Menghapus pengguna dari grup.

public function removeUser(int $uid): bool

Contoh:

$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();
}
KonstanNilaiDeskripsi
XOOPS_PERMISSION_NONE0Tidak ada izin
XOOPS_PERMISSION_VIEW1Lihat konten
XOOPS_PERMISSION_SUBMIT2Kirim konten
XOOPS_PERMISSION_EDIT4Sunting konten
XOOPS_PERMISSION_DELETE8Hapus konten
XOOPS_PERMISSION_ADMIN16Akses Admin
/**
* 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 mengelola operasi persistensi pengguna.

/**
* 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);
<?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. Hash Kata Sandi - Selalu gunakan bcrypt atau argon2 untuk hashing kata sandi
  2. Validasi Input - Validasi dan sanitasi semua input pengguna
  3. Periksa Izin - Selalu verifikasi izin pengguna sebelum mengambil tindakan
  4. Gunakan Sesi dengan Aman - Buat ulang ID sesi saat login
  5. Log Aktivitas - Log login, logout, dan tindakan penting
  6. Pembatasan Kecepatan - Menerapkan pembatasan kecepatan upaya login
  7. Hanya HTTPS - Selalu gunakan HTTPS untuk autentikasi
  8. Manajemen Grup - Gunakan grup untuk organisasi izin
  • ../Kernel/Kernel-Classes - Layanan kernel dan bootstrapping
  • ../Database/QueryBuilder - Kueri basis data untuk data pengguna
  • ../Core/XoopsObject - Kelas objek dasar

Lihat juga: Pengguna XOOPS API | Keamanan PHP