136 lines
3.0 KiB
PHP
136 lines
3.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
final class Auth
|
|
{
|
|
private const CLE_UTILISATEUR = "utilisateur_id";
|
|
|
|
public function __construct(
|
|
private readonly UtilisateurService $utilisateurService
|
|
)
|
|
{
|
|
}
|
|
|
|
public function demarrerSession(): void
|
|
{
|
|
if (session_status() === PHP_SESSION_ACTIVE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
$duree = Config::get("sessionLifetime", 86400);
|
|
|
|
session_set_cookie_params([
|
|
"lifetime" => $duree,
|
|
"path" => "/",
|
|
"httponly" => true,
|
|
"samesite" => "Lax",
|
|
"secure" => false
|
|
]);
|
|
|
|
session_start();
|
|
}
|
|
|
|
public function connecter(array $utilisateur): void
|
|
{
|
|
session_regenerate_id(true);
|
|
$_SESSION[self::CLE_UTILISATEUR] = $utilisateur["id"];
|
|
}
|
|
|
|
public function deconnecter(): void
|
|
{
|
|
$_SESSION = [];
|
|
|
|
if (ini_get("session.use_cookies"))
|
|
{
|
|
$params = session_get_cookie_params();
|
|
setcookie(
|
|
session_name(),
|
|
"",
|
|
time() - 42000,
|
|
$params["path"],
|
|
$params["domain"] ?? "",
|
|
(bool) $params["secure"],
|
|
(bool) $params["httponly"]
|
|
);
|
|
}
|
|
|
|
session_destroy();
|
|
}
|
|
|
|
public function estConnecte(): bool
|
|
{
|
|
return $this->utilisateurCourant() !== null;
|
|
}
|
|
|
|
public function utilisateurCourant(): ?array
|
|
{
|
|
$id = $_SESSION[self::CLE_UTILISATEUR] ?? null;
|
|
|
|
if (!is_string($id) || $id === "")
|
|
{
|
|
return null;
|
|
}
|
|
|
|
$utilisateur = $this->utilisateurService->trouverParId($id);
|
|
|
|
if ($utilisateur === null || !($utilisateur["actif"] ?? false))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return $utilisateur;
|
|
}
|
|
|
|
public function exigerConnexion(): array
|
|
{
|
|
$utilisateur = $this->utilisateurCourant();
|
|
|
|
if ($utilisateur === null)
|
|
{
|
|
Flash::definir("warning", "Veuillez vous connecter pour continuer.");
|
|
Helpers::rediriger("/connexion");
|
|
}
|
|
|
|
return $utilisateur;
|
|
}
|
|
|
|
public function exigerAdmin(): array
|
|
{
|
|
$utilisateur = $this->exigerConnexion();
|
|
|
|
if (($utilisateur["role"] ?? "") !== "admin")
|
|
{
|
|
Flash::definir("danger", "Accès réservé aux administrateurs.");
|
|
Helpers::rediriger("/");
|
|
}
|
|
|
|
return $utilisateur;
|
|
}
|
|
|
|
public function tenterConnexion(string $identifiant, string $motDePasse): bool
|
|
{
|
|
$utilisateur = $this->utilisateurService->trouverParIdentifiant($identifiant);
|
|
|
|
if ($utilisateur === null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!($utilisateur["actif"] ?? false))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!password_verify($motDePasse, $utilisateur["motDePasseHash"]))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$this->connecter($utilisateur);
|
|
|
|
return true;
|
|
}
|
|
}
|