Système de connexion : la base de toute application web
Inscription, connexion, déconnexion et gestion de session : voici comment créer un système d’authentification sécurisé avec PHP et MySQL.
La base de données
CREATE DATABASE auth_system;
USE auth_system;
CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
mot_de_passe VARCHAR(255) NOT NULL, -- Hash, JAMAIS en clair !
date_creation DATETIME DEFAULT CURRENT_TIMESTAMP,
actif BOOLEAN DEFAULT TRUE
);
Connexion à la base de données (config.php)
<?php
// config.php - À placer en dehors du dossier public si possible
$host = 'localhost';
$dbname = 'auth_system';
$user = 'root';
$pass = '';
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user, $pass,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
);
} catch (PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}
?>
Page d’inscription (inscription.php)
<?php
require_once 'config.php';
$erreur = '';
$succès = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nom = trim($_POST['nom']);
$email = trim($_POST['email']);
$mdp = $_POST['mot_de_passe'];
$mdp_confirm = $_POST['mot_de_passe_confirm'];
// Validations
if (strlen($nom) < 2) {
$erreur = "Le nom doit contenir au moins 2 caractères";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erreur = "Email invalide";
} elseif (strlen($mdp) < 8) {
$erreur = "Le mot de passe doit contenir au moins 8 caractères";
} elseif ($mdp !== $mdp_confirm) {
$erreur = "Les mots de passe ne correspondent pas";
} else {
// Vérifier si l'email existe déjà
$stmt = $pdo->préparé("SELECT id FROM utilisateurs WHERE email = ?");
$stmt->exécuté([$email]);
if ($stmt->fetch()) {
$erreur = "Cet email est déjà utilisé";
} else {
// Hasher le mot de passe (JAMAIS stocker en clair !)
$hash = password_hash($mdp, PASSWORD_DEFAULT);
$stmt = $pdo->préparé("INSERT INTO utilisateurs (nom, email, mot_de_passe) VALUES (?, ?, ?)");
$stmt->exécuté([$nom, $email, $hash]);
$succès = "Compte créé avec succès ! Vous pouvez vous connecter.";
}
}
}
?>
<form method="POST">
<?php if ($erreur): ?>
<div class="alerte erreur">⚠️ <?= htmlspecialchars($erreur) ?></div>
<?php endif; ?>
<?php if ($succès): ?>
<div class="alerte succès">✅ <?= htmlspecialchars($succès) ?></div>
<?php endif; ?>
<input type="text" name="nom" placeholder="Votre nom" required>
<input type="email" name="email" placeholder="Votre email" required>
<input type="password" name="mot_de_passe" placeholder="Mot de passe (8 car. min)" required>
<input type="password" name="mot_de_passe_confirm" placeholder="Confirmer le mot de passe" required>
<button type="submit">S'inscrire</button>
</form>
Page de connexion (connexion.php)
<?php
require_once 'config.php';
session_start();
$erreur = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email']);
$mdp = $_POST['mot_de_passe'];
// Chercher l'utilisateur par email
$stmt = $pdo->préparé("SELECT * FROM utilisateurs WHERE email = ? AND actif = TRUE");
$stmt->exécuté([$email]);
$user = $stmt->fetch();
// Vérifier le mot de passe hashé
if ($user && password_verify($mdp, $user['mot_de_passe'])) {
// Connexion réussie ! Créer la session
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_nom'] = $user['nom'];
$_SESSION['user_email'] = $user['email'];
// Régénérer l'ID de session (sécurité)
session_regenerate_id(true);
header('Location: dashboard.php');
exit;
} else {
$erreur = "Email ou mot de passe incorrect";
}
}
?>
<form method="POST">
<?php if ($erreur): ?>
<div class="alerte erreur">⚠️ <?= htmlspecialchars($erreur) ?></div>
<?php endif; ?>
<input type="email" name="email" placeholder="Votre email" required>
<input type="password" name="mot_de_passe" placeholder="Mot de passe" required>
<button type="submit">Se connecter</button>
<p>Pas encore de compte ? <a href="inscription.php">S'inscrire</a></p>
</form>
Protection des pages (auth.php)
<?php
// auth.php - Inclure en haut de chaque page protégée
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: connexion.php');
exit;
}
?>
<!-- dashboard.php -->
<?php require_once 'auth.php'; ?>
<h1>Bienvenue, <?= htmlspecialchars($_SESSION['user_nom']) ?> !</h1>
<a href="deconnexion.php">Se déconnecter</a>
Déconnexion (deconnexion.php)
<?php
session_start();
session_unset();
session_destroy();
header('Location: connexion.php');
exit;
?>
⚠️ Règles de sécurité essentielles
- password_hash() et password_verify() : TOUJOURS hasher les mots de passe
- Requêtes préparées : JAMAIS concaténer les variables dans les requêtes SQL
- htmlspecialchars() : TOUJOURS échapper l’affichage pour éviter les attaques XSS
- session_regenerate_id() : après la connexion pour éviter le vol de session
- HTTPS : obligatoire en production pour protéger les mots de passe en transit
Exercice pratique
🎯 Défi : Système d’authentification complet
- Créez la base de données et la table utilisateurs
- Implémentez inscription, connexion, déconnexion
- Protégez une page « dashboard » accessible uniquement aux connectés
- Ajoutez un message « Bienvenue [nom] » dans le dashboard
- Bonus : ajoutez la fonctionnalité « mot de passe oublié »