07 — Protection des routes : checkAuth et checkAdmin
Définition
La protection des routes consiste à vérifier que l’utilisateur a les droits nécessaires avant d’exécuter une action. Dans notre application, deux fonctions globales assurent cette protection : checkAuth() et checkAdmin().
🔗 Comparaison Laravel
| Notre blog | Laravel |
|---|---|
checkAuth() au début de chaque méthode |
Middleware auth |
checkAdmin() au début de chaque méthode admin |
Middleware can:admin ou Gates/Policies |
| Appliqué manuellement dans chaque méthode | Appliqué automatiquement via ->middleware('auth') sur les routes |
Exemple Laravel :
// Dans routes/web.php
Route::get('/dashboard', [UserController::class, 'dashboard'])
->middleware('auth'); // Protège automatiquement la route
Route::get('/admin', [AdminController::class, 'index'])
->middleware(['auth', 'can:admin']);
Notre blog :
// Dans chaque méthode de contrôleur
public function dashboard(): void
{
checkAuth(); // Protection manuelle
Renderer::render('users/user-dashboard', ...);
}
C’est plus verbeux, mais le principe est identique.
📄 Les fonctions dans app/helpers.php
use App\Enums\Role;
/**
* Vérifie si l'utilisateur est connecté
*/
function checkAuth(): void
{
if (!isset($_SESSION['auth']) || !is_array($_SESSION['auth'])) {
redirect('/login.php');
}
}
/**
* Vérifie si l'utilisateur est administrateur
*/
function checkAdmin(): void
{
checkAuth();
if ($_SESSION['auth']['role'] !== Role::ADMIN->value) {
redirect('/');
}
}
Analyse pas à pas
checkAuth() — Étape par étape
if (!isset($_SESSION['auth']) || !is_array($_SESSION['auth'])) {
redirect('/login.php');
}
Condition 1 : !isset($_SESSION['auth'])
Vérifie si la clé auth existe dans la session. Elle est définie lors de la connexion via $user->toSession(). Si elle n’existe pas, l’utilisateur n’est pas connecté.
Condition 2 : !is_array($_SESSION['auth'])
Une protection supplémentaire. On s’assure que $_SESSION['auth'] est bien un tableau (pas une chaîne ou un entier corrompue). Cela protège contre des attaques de manipulation de session.
Action : redirect('/login.php')
Si l’utilisateur n’est pas connecté, on le redirige vers la page de connexion. La fonction redirect() appelle exit(), donc le reste du contrôleur ne s’exécute pas.
checkAdmin() — Étape par étape
function checkAdmin(): void
{
checkAuth(); // D'abord vérifier qu'il est connecté
if ($_SESSION['auth']['role'] !== Role::ADMIN->value) {
redirect('/');
}
}
Étape 1 : Réutiliser checkAuth()
On appelle d’abord checkAuth(). Si l’utilisateur n’est pas connecté, la redirection vers /login.php se produit immédiatement. checkAdmin() ne continue pas.
Étape 2 : Vérifier le rôle
$_SESSION['auth']['role'] !== Role::ADMIN->value
Role::ADMIN->value retourne la valeur de l’Enum ADMIN, par exemple 'admin'. On compare avec le rôle stocké en session. Si ce n’est pas un admin, on redirige vers l’accueil.
L’Enum Role
namespace App\Enums;
enum Role: string
{
case ADMIN = 'admin';
case USER = 'user';
}
L’utilisation d’un Enum PHP 8.1+ évite les “magic strings” dispersées dans le code. On compare Role::ADMIN->value plutôt que la chaîne littérale 'admin'.
Utilisation dans les contrôleurs
// Méthode réservée aux utilisateurs connectés
public function dashboard(): void
{
checkAuth(); // ← Protection
Renderer::render('users/user-dashboard', [...], 'user-layout');
}
// Méthode réservée aux administrateurs
public function add(): void
{
checkAdmin(); // ← Protection renforcée
// Traitement...
}
🔮 Vers les Middlewares (style Laravel)
La prochaine évolution serait d’intégrer cette logique directement dans le routeur :
// Évolution future possible
$router->get('/admin.php', [AdminController::class, 'index'])
->middleware('admin');
C’est exactement le système de Middleware de Laravel : une couche de protection qui s’exécute avant le contrôleur.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur 07 — Protection des routes : `checkAuth` et `checkAdmin`. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.