208 lines
7.1 KiB
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);
|
|
}
|
|
}
|