Tp 2 php render redirect blogpoo
Thème :
Junior
1 vues ·25/30 leçons

25. Refactoring de l’Authentification

1. La Connexion (login.php)

Code complet PHP

<?php

declare(strict_types=1);
session_start();
require_once 'database/database.php';
require_once 'flash.php';
require_once 'app/Emuns/Role.php';
require_once 'app/helpers.php';

// /**
//  * Authenticate a user
//  */
function authenticateUser(PDO $pdo, string $email, string $password): string {
    if (empty($email) || empty($password)) {
        return "Tous les champs doivent être complétés !";
    }

    $stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email OR username = :email");
    $stmt->execute([':email' => $email]);
    $user = $stmt->fetch();

    if (!$user) {
        return "Compte inexistant !";
    }

    if (!password_verify($password, $user['password'])) {
        return "Mauvais mot de passe !";
    }

    // Set session variables
    $_SESSION['auth'] = [
        'id' => $user['id'],
        'username' => $user['username'],
        'email' => $user['email'],
        'role' => $user['role']
    ];

    return "success";
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
    $email = strip_tags($_POST['email'] ?? '');
    $password = $_POST['password'] ?? '';

    $result = authenticateUser($pdo, $email, $password);

    if ($result === "success") {
        flash_set('success', "Heureux de vous revoir " . $_SESSION['auth']['username'] . " !");


        // Redirect based on role or to index
        if ($_SESSION['auth']['role'] === Role::ADMIN->value) {
            redirect('admin.php');
        } else {
            redirect('user-dashboard.php');
        }
    } else {
        flash_set('error', $result);
        redirect('login.php');
    }
}




$pageTitle = 'Connexion';
render('users/login', ['pageTitle' => $pageTitle], 'blog-layout');

Explications pas à pas (PHP)

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {

Explication : On vérifie si le formulaire a été soumis avec la méthode POST et si le bouton de connexion (nommé ‘login’) a été pressé.

    $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
    $password = $_POST['password'] ?? '';

Explication : filter_var s’assure que le texte entré ressemble bien à un email.

    $query = $pdo->prepare('SELECT * FROM users WHERE email = :email');
    $query->execute(['email' => $email]);
    $user = $query->fetch(PDO::FETCH_ASSOC);

Explication : On cherche l’utilisateur par son email.

    if ($user && password_verify($password, $user['password'])) {
        $_SESSION['auth'] = $user;
        redirect('user-dashboard.php');
    } else {
        $errors['login'] = 'Email ou mot de passe incorrect';
    }

Explication : password_verify() compare le mot de passe en clair tapé par l’utilisateur avec l’empreinte hachée présente en base de données. Si c’est bon, on stocke l’utilisateur en session et on le redirige !


Code complet HTML (resources/views/users/login_html.php)

<div class="container-part">
    <!-- Colonne de gauche : Grande image avec superposition -->
    <div class="image-column">
        <div class="image-overlay"></div>
        <img src="/publicAll/images/log.png" alt="Image d'arrière-plan" />
    </div>

    <!-- Colonne de droite : Formulaire de connexion -->
    <div class="form-container">
        <form action="" method="POST">
            <div class="form-group">
                <h2>Connection</h2>
                <?php if (isset($errors['email'])) { ?>
                <p style="color:#f86262;"><?= $errors['email'] ?></p>
                <?php } ?>
                <div class="input-group">
                    <i class="bx bxs-envelope icon"></i>
                    <input type="text" name="email" placeholder="Email ou pseudo" />
                </div>

                <div class="input-group">
                    <i class="bx bxs-lock-alt icon"></i>
                    <input type="password" name="password" placeholder="Mot de passe" />
                </div>
                <button type="submit" name="login">Se connecter</button>

                <!-- Liens d'authentification -->
                <div class="auth-links">
                    <span class="auth-link" style="color:black"> <i class="bx bx-log-in"></i>Connectez-vous ou </span>
                    <a href="/register.php" class="auth-link">
                        <i class="bx bx-user-plus"></i>
                        <u>Inscrivez-vous</u>
                    </a>
                </div>
            </div>
        </form>
    </div>
</div>

<script src="/resources/js/particul.js"></script>

Explications pas à pas (HTML)

<?php if (!empty($errors['login'])): ?>
<div class="alert alert-danger" style="..."><?= htmlspecialchars($errors['login']) ?></div>
<?php endif; ?>

Explication : Si le tableau $errors envoyé par le contrôleur n’est pas vide, on affiche le message d’erreur.

<form method="POST" action="login.php">
    <div>
        <label for="email">Adresse e-mail :</label>
        <input type="email" id="email" name="email" required />
    </div>
</form>

Explication : L’attribut name="email" est crucial : c’est sous ce nom que PHP récupérera la donnée via $_POST['email'].


2. La Déconnexion (logout.php)

Code complet PHP

<?php
session_start();
require_once 'flash.php';
require_once 'app/helpers.php';

$_SESSION = [];
flash_set('success', "Vous avez été déconnecté avec succès.");

redirect('login.php');

Explications pas à pas

Ce fichier n’a pas de vue HTML.

$_SESSION = [];
session_destroy();
redirect('index.php');

Explication :

  1. On vide le tableau $_SESSION.
  2. session_destroy() supprime le fichier de session côté serveur.
  3. On redirige le visiteur vers l’accueil.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur 25. Refactoring de l'Authentification. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.