0, // Cookie de session (expire à la fermeture navigateur) 'path' => '/mathematiques/', // Chemin - CRITIQUE pour que la session persiste 'domain' => '', // Domaine par défaut 'secure' => false, // HTTPS seulement (false car on utilise HTTP) 'httponly' => true, // Pas accessible via JavaScript (sécurité XSS) 'samesite' => 'Lax' // Protection CSRF (Lax = compatible avec redirections) ]); // Configuration supplémentaire via ini_set (pour compatibilité) ini_set('session.use_strict_mode', '1'); ini_set('session.gc_maxlifetime', '5400'); // 90 minutes d'inactivité max (x3) // Démarrage de la session if (session_status() === PHP_SESSION_NONE) { session_start(); } /** * Classe SessionManager - Gestion centralisée des sessions */ class SessionManager { /** * Durée de vie de la session en secondes (90 minutes) */ private const SESSION_LIFETIME = 5400; // 90 minutes (x3) /** * Vérifier si l'utilisateur est connecté */ public static function isLoggedIn() { // Vérifier si la session contient un utilisateur if (!isset($_SESSION['user_id'])) { return false; } // Vérifier le timeout de session if (isset($_SESSION['last_activity'])) { $elapsed = time() - $_SESSION['last_activity']; if ($elapsed > self::SESSION_LIFETIME) { self::logout(); return false; } } // Vérifier la cohérence du user agent (sécurité basique) if (isset($_SESSION['user_agent'])) { if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { self::logout(); return false; } } // Mettre à jour le timestamp d'activité $_SESSION['last_activity'] = time(); return true; } /** * Créer une session pour un utilisateur * * @param array $utilisateur Données de l'utilisateur depuis la BDD */ public static function login($utilisateur) { // Régénérer l'ID de session pour éviter la fixation session_regenerate_id(false); // false = garde ancien fichier pour éviter race condition // Stocker les informations utilisateur $_SESSION['user_id'] = $utilisateur['id_utilisateur']; $_SESSION['login'] = $utilisateur['login']; $_SESSION['nom'] = $utilisateur['nom']; $_SESSION['prenom'] = $utilisateur['prenom']; $_SESSION['id_type'] = $utilisateur['id_type']; $_SESSION['type_libelle'] = $utilisateur['type_libelle']; $_SESSION['id_classe'] = $utilisateur['id_classe'] ?? null; $_SESSION['nom_classe'] = $utilisateur['nom_classe'] ?? null; $_SESSION['niveau'] = $utilisateur['niveau'] ?? null; // Informations de sécurité $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT']; $_SESSION['last_activity'] = time(); $_SESSION['login_time'] = time(); // Mettre à jour la date de dernière connexion self::updateLastLogin($utilisateur['id_utilisateur']); } /** * Détruire la session (déconnexion) */ public static function logout() { $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 3600, '/'); } session_destroy(); } /** * Récupérer les informations de l'utilisateur connecté * * @return array|null Données utilisateur ou null si non connecté */ public static function getUser() { if (!self::isLoggedIn()) { return null; } return [ 'id_utilisateur' => $_SESSION['user_id'], 'id' => $_SESSION['user_id'], // Alias pour compatibilité 'login' => $_SESSION['login'], 'nom' => $_SESSION['nom'], 'prenom' => $_SESSION['prenom'], 'id_type' => $_SESSION['id_type'], 'type_libelle' => $_SESSION['type_libelle'], 'id_classe' => $_SESSION['id_classe'], 'nom_classe' => $_SESSION['nom_classe'], 'niveau' => $_SESSION['niveau'] ]; } /** * Vérifier si l'utilisateur est un élève */ public static function isEleve() { return self::isLoggedIn() && (isset($_SESSION['id_type']) && ($_SESSION['id_type'] == 2 || $_SESSION['id_type'] == 3)); } /** * Vérifier si l'utilisateur est un élève libre (soutien) */ public static function isEleveLibre() { return self::isLoggedIn() && (isset($_SESSION['id_type']) && $_SESSION['id_type'] == 3); } /** * Vérifier si l'utilisateur est un élève de classe fixe */ public static function isEleveClasse() { return self::isLoggedIn() && (isset($_SESSION['id_type']) && $_SESSION['id_type'] == 2); } /** * Vérifier si l'utilisateur est un enseignant */ public static function isEnseignant() { return self::isLoggedIn() && (isset($_SESSION['id_type']) && $_SESSION['id_type'] == 1); } /** * Mettre à jour la date de dernière connexion * * @param int $userId ID de l'utilisateur */ private static function updateLastLogin($userId) { try { require_once __DIR__ . '/../config/database.php'; $db = Database::getInstance(); $query = "UPDATE utilisateurs SET date_derniere_connexion = NOW() WHERE id_utilisateur = ?"; $db->query($query, [$userId]); } catch (Exception $e) { error_log("Erreur mise à jour dernière connexion : " . $e->getMessage()); } } /** * Obtenir le temps restant de session en secondes */ public static function getRemainingTime() { if (!self::isLoggedIn()) { return 0; } $elapsed = time() - $_SESSION['last_activity']; return max(0, self::SESSION_LIFETIME - $elapsed); } }