Files
webval/config/session.php

208 lines
7.1 KiB
PHP

<?php
/**
* Gestionnaire de sessions utilisateur
* Fichier : includes/session.php
*/
// ═══════════════════════════════════════════════════════════════
// CONFIGURATION COOKIES DE SESSION
// ═══════════════════════════════════════════════════════════════
// IMPORTANT : Doit être fait AVANT session_start() !
// Méthode recommandée : session_set_cookie_params()
// Définir le nom de session (doit être fait AVANT session_start)
session_name('PHPSESSID'); // Utiliser le nom standard pour cohérence
session_set_cookie_params([
'lifetime' => 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);
}
}