Files
webval/auth.php

225 lines
7.3 KiB
PHP

<?php
/**
* Gestionnaire d'authentification
* Fichier : auth.php
* Gère : Connexion classique + Inscription libre
*/
require_once __DIR__ . '/config/config.php';
require_once __DIR__ . '/config/database.php';
require_once __DIR__ . '/config/session.php';
// Vérifier la méthode HTTP
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: login.php');
exit;
}
// ==========================================
// INSCRIPTION LIBRE (élèves soutien)
// ==========================================
if (isset($_GET['action']) && $_GET['action'] === 'register') {
// Récupération des données du formulaire
$prenom = trim($_POST['prenom'] ?? '');
$nom = trim($_POST['nom'] ?? '');
$password = trim($_POST['password'] ?? '');
$errors = [];
// Validation des champs
if (empty($prenom)) {
$errors[] = "Le prénom est obligatoire.";
}
if (empty($nom)) {
$errors[] = "Le nom est obligatoire.";
}
if (empty($password)) {
$errors[] = "Le mot de passe est obligatoire.";
}
// Validation format mot de passe (JJMM - 4 chiffres)
if (!empty($password) && !preg_match('/^\d{4}$/', $password)) {
$errors[] = "Le mot de passe doit être au format JJMM (4 chiffres, ex: 2710).";
}
// Si erreurs, rediriger avec message
if (!empty($errors)) {
$_SESSION['error'] = implode('<br>', $errors);
header('Location: login.php');
exit;
}
try {
$db = Database::getInstance();
// Génération du login : prenom.nom (minuscules, sans accents)
$login = generateLogin($prenom, $nom);
// Vérifier si le login existe déjà
$checkQuery = "SELECT id_utilisateur FROM utilisateurs WHERE login = ?";
$existing = $db->fetchOne($checkQuery, [$login]);
if ($existing) {
// Login déjà pris, ajouter un suffixe numérique
$counter = 1;
$baseLogin = $login;
do {
$login = $baseLogin . $counter;
$existing = $db->fetchOne($checkQuery, [$login]);
$counter++;
} while ($existing && $counter < 100);
if ($existing) {
throw new Exception("Impossible de générer un login unique.");
}
}
// Hashage du mot de passe
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
// Insertion de l'utilisateur (élève libre)
$insertQuery = "INSERT INTO utilisateurs
(login, mot_de_passe, nom, prenom, id_type, id_classe, actif)
VALUES (?, ?, ?, ?, 3, (SELECT id_classe FROM classes WHERE type_classe='soutien' LIMIT 1), 1)";
$userId = $db->insert($insertQuery, [
$login,
$passwordHash,
ucfirst(strtolower($nom)),
ucfirst(strtolower($prenom))
]);
// Récupération des infos complètes pour la session
$userQuery = "SELECT u.*, t.libelle as type_libelle
FROM utilisateurs u
INNER JOIN types_utilisateurs t ON u.id_type = t.id_type
WHERE u.id_utilisateur = ?";
$utilisateur = $db->fetchOne($userQuery, [$userId]);
if (!$utilisateur) {
throw new Exception("Erreur lors de la création du compte.");
}
// Connexion automatique après inscription
SessionManager::login($utilisateur);
// Message de succès
$_SESSION['success'] = "Inscription réussie ! Bienvenue " . $utilisateur['prenom'] . " (login: " . $login . ")";
// Redirection vers dashboard élève
header('Location: eleve/dashboard.php');
exit;
} catch (Exception $e) {
error_log("Erreur inscription libre : " . $e->getMessage());
$_SESSION['error'] = "Erreur lors de l'inscription : " . $e->getMessage();
header('Location: login.php');
exit;
}
}
// ==========================================
// CONNEXION CLASSIQUE
// ==========================================
else {
// Récupération des données du formulaire
$login = trim($_POST['login'] ?? '');
$password = trim($_POST['password'] ?? '');
// Validation basique
if (empty($login) || empty($password)) {
$_SESSION['error'] = "Veuillez remplir tous les champs.";
header('Location: login.php');
exit;
}
try {
$db = Database::getInstance();
// Recherche de l'utilisateur avec ses informations complètes
$query = "SELECT u.*,
t.libelle as type_libelle,
c.nom_classe,
c.niveau
FROM utilisateurs u
INNER JOIN types_utilisateurs t ON u.id_type = t.id_type
LEFT JOIN classes c ON u.id_classe = c.id_classe
WHERE u.login = ? AND u.actif = 1";
$utilisateur = $db->fetchOne($query, [$login]);
// Vérifier si l'utilisateur existe
if (!$utilisateur) {
$_SESSION['error'] = "Identifiant ou mot de passe incorrect.";
header('Location: login.php');
exit;
}
// Vérifier le mot de passe
if (!password_verify($password, $utilisateur['mot_de_passe'])) {
$_SESSION['error'] = "Identifiant ou mot de passe incorrect.";
header('Location: login.php');
exit;
}
// Créer la session
SessionManager::login($utilisateur);
// Redirection selon le type d'utilisateur
if ($utilisateur['id_type'] == 1) {
// Enseignant
header('Location: enseignant/dashboard.php');
} else {
// Élève (classe ou libre)
header('Location: eleve/dashboard.php');
}
exit;
} catch (Exception $e) {
error_log("Erreur connexion : " . $e->getMessage());
$_SESSION['error'] = "Erreur lors de la connexion. Veuillez réessayer.";
header('Location: login.php');
exit;
}
}
/**
* Générer un login à partir du prénom et nom
* Format : prenom.nom (minuscules, sans accents)
*/
function generateLogin($prenom, $nom) {
// Conversion en minuscules
$prenom = strtolower($prenom);
$nom = strtolower($nom);
// Suppression des accents
$prenom = removeAccents($prenom);
$nom = removeAccents($nom);
// Suppression des caractères spéciaux (garder seulement lettres et chiffres)
$prenom = preg_replace('/[^a-z0-9]/', '', $prenom);
$nom = preg_replace('/[^a-z0-9]/', '', $nom);
return $prenom . '.' . $nom;
}
/**
* Supprimer les accents d'une chaîne
*/
function removeAccents($string) {
$accents = [
'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a',
'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e',
'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o',
'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u',
'ý' => 'y', 'ÿ' => 'y',
'ñ' => 'n', 'ç' => 'c'
];
return strtr($string, $accents);
}