225 lines
7.3 KiB
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);
|
|
}
|