Tp 7 php framework mvc blogpoo
Thème :
Junior
1 vues ·8/12 leçons

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.