131 lines
4.0 KiB
PHP
131 lines
4.0 KiB
PHP
<?php
|
|
/**
|
|
* core/Auth.php
|
|
* Gestión de sesión y autenticación de usuarios del panel.
|
|
* Extraído de config/config.php para separar responsabilidades.
|
|
*
|
|
* USO:
|
|
* require_once __DIR__ . '/../core/Auth.php';
|
|
* Auth::requireLogin(); // en cualquier vista protegida
|
|
* Auth::requireNotEnfermero(); // excluir enfermeros del panel admin
|
|
*/
|
|
|
|
class Auth
|
|
{
|
|
// ─── Verificación de sesión ─────────────────────────────────────────────
|
|
|
|
public static function isLoggedIn(): bool
|
|
{
|
|
return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true;
|
|
}
|
|
|
|
public static function requireLogin(string $redirect = 'login.php'): void
|
|
{
|
|
if (!self::isLoggedIn()) {
|
|
header("Location: $redirect");
|
|
exit;
|
|
}
|
|
}
|
|
|
|
public static function requireNotEnfermero(string $redirect = 'enfermero_portal.php'): void
|
|
{
|
|
if (self::isEnfermero()) {
|
|
header("Location: $redirect");
|
|
exit;
|
|
}
|
|
}
|
|
|
|
// ─── Datos del usuario en sesión ────────────────────────────────────────
|
|
|
|
public static function id(): ?int
|
|
{
|
|
return isset($_SESSION['admin_user']['id'])
|
|
? (int) $_SESSION['admin_user']['id']
|
|
: null;
|
|
}
|
|
|
|
public static function role(): string
|
|
{
|
|
return $_SESSION['admin_user']['role'] ?? 'admin';
|
|
}
|
|
|
|
public static function fullName(): string
|
|
{
|
|
return $_SESSION['admin_user']['full_name']
|
|
?? $_SESSION['admin_user']['username']
|
|
?? 'Usuario';
|
|
}
|
|
|
|
public static function roleId(): ?int
|
|
{
|
|
$id = $_SESSION['admin_user']['role_id'] ?? null;
|
|
return $id ? (int) $id : null;
|
|
}
|
|
|
|
public static function isEnfermero(): bool
|
|
{
|
|
return self::role() === 'enfermero';
|
|
}
|
|
|
|
public static function isAdmin(): bool
|
|
{
|
|
return self::role() === 'admin';
|
|
}
|
|
|
|
public static function isSuperAdmin(): bool
|
|
{
|
|
return self::role() === 'superadmin';
|
|
}
|
|
|
|
// ─── Login / Logout ─────────────────────────────────────────────────────
|
|
|
|
/**
|
|
* Intenta autenticar usuario contra la BD.
|
|
* Devuelve array con datos del usuario o false si falla.
|
|
*/
|
|
public static function attempt(string $username, string $password): array|false
|
|
{
|
|
// Delegar en la función legacy de config.php mientras coexistan
|
|
// (authenticateUser está definida en config/config.php)
|
|
return authenticateUser($username, $password);
|
|
}
|
|
|
|
/**
|
|
* Establece la sesión tras un login exitoso.
|
|
*/
|
|
public static function login(array $userData): void
|
|
{
|
|
session_regenerate_id(true);
|
|
$_SESSION['admin_logged_in'] = true;
|
|
$_SESSION['admin_user'] = $userData;
|
|
$_SESSION['login_time'] = time();
|
|
}
|
|
|
|
public static function logout(): void
|
|
{
|
|
$_SESSION = [];
|
|
if (ini_get('session.use_cookies')) {
|
|
$p = session_get_cookie_params();
|
|
setcookie(
|
|
session_name(), '', time() - 42000,
|
|
$p['path'], $p['domain'], $p['secure'], $p['httponly']
|
|
);
|
|
}
|
|
session_destroy();
|
|
}
|
|
|
|
// ─── Tiempo de sesión ───────────────────────────────────────────────────
|
|
|
|
public static function isSessionExpired(): bool
|
|
{
|
|
if (!isset($_SESSION['login_time'])) return false;
|
|
$timeout = defined('SESSION_TIMEOUT') ? SESSION_TIMEOUT : 1800;
|
|
return (time() - $_SESSION['login_time']) > $timeout;
|
|
}
|
|
|
|
public static function refreshSession(): void
|
|
{
|
|
$_SESSION['login_time'] = time();
|
|
}
|
|
}
|