Initial commit (code), runtime ignoré, secrets exclus
This commit is contained in:
207
config/session.php
Normal file
207
config/session.php
Normal file
@ -0,0 +1,207 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user