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