Aller au contenu

En pratique

Dans l'exercice blog, nous allons ajouter les fonctionnalités suivantes :

  • permettre de lister les utilisateurs en mode non connecté
  • ajouter la connexion et la déconnexion
  • gérer les articles uniquement en mode connecté
  • dans la page "gestion", permettre le tri des articles par id ou par titre en cliquant sur l'intulé des colonnes du tableau
  • mémoriser le choix du tri dans un cookie

Pour cette partie, téléchargez la version de départ sur GitHub >>

Veillez à modifier les valeurs dans les fichiers de configuration(config_perso.inc.php etconfig.inc.php)

Astuce

Pour télécharger les sources,

- cliquer sur le bouton vert `<> Code`
- cliquer sur `Download Zip`

Download souce

BD

Nous allons créer une nouvelle table dans la bd afin de gérer les utilisateurs.

Analysez et exécutez le script sql présent dans le dossier.

Gestion des user

Class User et Repository

Créez un fichier nommédb_user.inc.php Sur base du fichierdb_article.inc.php, créez

  • la classeUser
  • la classeUserRepository
  • la méthodegetAllUsers
  • la méthodegetUserById

Lister les utilisateurs

Créez un fichier nommégestionUser.php qui listera tous les utilisateurs présents dans la DB.

Ajouter l'item dans le menu

Warning

Dans le cadre d'un projet réel, on retiendrait en base de données, pour chaque article, l'identifiant de l'utilisateur l'ayant créé. Ici, nous avons volontairement simplifié l'exercice: nous n'avons donc pas prévu de clé étrangère dans la table des utilisateurs.

Ouvrir la session

Dans chaque page, nous allons ouvrir unesession().

Ajouter l'ouverture de la session dans chaque page.

<?php 
session_start();
Astuce

Afin de ne pas répéter le code dans chaque page, nous pouvons bien évidemment centraliser l'ouverture dans un fichier. Afin de bien comprendre le mécanisme, dans cet exercice, nous allons ajouter cette ouverture dans chaque fichier.

Formulaire de connexion

Ajouter un itemConnexion dans le menu de navigation qui pointe vers le fichierconnect.php.

Analysez le fichierconnect.php

Quelles sont les étapes à implémenter pour se connecter ?

Soluce
  • si soumission du formulaire : récupérer les données
  • vérifier les données : l'utilisateur existe-t-il dans la table et le mot de passe associé est-il correct ?
  • si non, afficher une erreur
  • si oui, stocker dans des variables de sessions l'id et le nom de l'utilisateur + rediriger l'utilisateur vers la page de gestion.php

Pour vérifier si l'utilisateur existe avec le mot de passe spécifié, il faut créer une nouvelle méthode.

Attention, les mots de passe sont cryptés dans la base de données. Il faudra donc crypter le mot de passe reçu du formulaire avant de l'utiliser dans la requête.

Soluce
<?php 
 /**
 * Vérifie les identifiants de connexion d'un utilisateur.
 *
 * @param string $username Nom d'utilisateur
 * @param string $password Mot de passe en clair (sera haché)
 * @param string &$message Référence à une variable de message d'état
 * @return \Blog\User|null Objet utilisateur si authentifié, sinon null
 */
public function checkLogin(string $username, string $password, string &$message): ?\Blog\User
{
    $result = null;
    $bdd = null;
    $hashedPassword = hash("sha512", $password);

    try {
        $bdd = DBLink::connect2db(MYDB, $message);
        if (!$bdd) return  $result;

        $stmt = $bdd->prepare(
            "SELECT * FROM " . self::TABLE_NAME . "  WHERE nom = :username AND mdp = :password"
        );
        $stmt->bindValue(':username', $username);
        $stmt->bindValue(':password', $hashedPassword);

        if ($stmt->execute()) {
            $obj = $stmt->fetchObject(\Blog\User::class);
            $result = $obj !== false ? $obj : null;
        } else {
            $message .= 'Une erreur système est survenue.<br> 
            Veuillez essayer à nouveau plus tard ou contactez l\'administrateur du site. 
            (Code erreur: ' . $stmt->errorCode() . ')<br>';
        }
    } catch (\Exception $e) {
        $message .= $e->getMessage() . '<br>';
    }

    DBLink::disconnect($bdd);
    return $result;
}

Implémentez le code lorsque l'utilisateur clique sur le bouton de soumission du formulaire.

Astuce

Pour rediriger l'utilisateur, vous pouvez uitiliser

 <? php 
 header("location:".BASE_URL. "/public/admin/gestion.php");

Warning

Testez votre code. Corrigez les erreurs éventuelles avant d'aller plus loin.

Dans notre exercice, le mot de passe est équivalent au nom d'utilisateur.

Modification menu

Une fois connecté, l'utilisateur ne doit plus avoir le lien vers la page Connexion à partir du menu.

Comment savoir si l'utilisateur s'est connecté ?

Soluce

Lorsque l'utilisateur se connecte, nous enregistrons sont id et son nom dans des variables de session. Nous pouvons donc nous baser sur ceux-ci et adapter le menu.

Implémentez la modification dans le menu : si l'utilisateur est connecté, on masque l'item connexion, on affiche son nom.

Soluce
<?php
if (isset($_SESSION['id_user'])) { ?>
    <li>Bonjour <?= $_SESSION['nom_user']; ?></li>
<?php } else { ?> 
    <li><a href="<?= BASE_URL ?>/public/admin/connect.php">Connexion</a></li>
<?php  }  ?>

Connexion inaccessible

Lorsque l'utilisateur s'est connecté, il ne doit plus avoir accès au formulaire de connexion.

Dans la page connect.php, nous allons donc ajouter une condition qui va vérifier si l'utilisateur est connecté. Si oui, nous redirigerons l'utilisateur vers la page de gestion.

Soluce
<?php
if (isset($_SESSION['nom_user'])) {
    header("location:".BASE_URL. "/public/admin/gestion.php");
}

Deconnexion

Il faut donner la possibilité à l'utilisateur de se déconnecter. Pour cela, nous allons ajouter un formulaire dans le menu. Lorsque l'utilisateur cliquera sur le bouton, la page d'index sera appelée.

Première étape

Ajoutez le bouton dans le menu de navigation.

Rappel : < i class="fa fa-sign-out" aria - hidden="true" ></ > permet d'afficher une icone Référence officielle >>

<?php 
if (isset($_SESSION['id_user'])) { ?>
<li>Bonjour <?= $_SESSION['nom_user']; ?></li>
<li>
    <form method="post" action="<?= BASE_URL ?>/">
        <button type="submit" name="logout" class="btn"><i class="fa fa-sign-out" aria-hidden="true"></i></button>
    </form>
</li>
<?php
} else { ?> <li><a href="<?= BASE_URL ?>/public/connect.php">Connexion</a></li>
<?php  }  ?>

Deuxième étape

  • Créez un fichier nommé gestion_deconnect.php dans le dossier php
  • Implémentez le code : si l'utilisateur clique sur le bouton deconnexion, le formulaire est envoyé. Utilisez la clé logout pour vérifier la soumission et détruisez la session.
  • Ajoutez l'include dans le fichier index.php
Soluce
<?php 
if (isset($_POST['logout'])) {
    $_SESSION = array();
    setcookie("PHPSESSID", "", time() - 3600, "/");
    session_destroy();
}

Warning

Testez votre code. Corrigez les erreurs éventuelles avant d'aller plus loin.

Pages inaccessibles

Les pages Gestion des articles et Ajout article ne doivent pas être accessibles en mode non connecté.

Dans ces pages, nous allons vérifier si l'utilisateur existe en session. Si ce n'est pas le cas, nous redirigons l'utilisateur vers la page de connexion.

  • Créez un fichier session.inc.php
  • Implémentez le code.
  • Réalisez les inclusions dans les fichiers Gestion des articles et Ajout article
Soluce
<?php 
if (!isset($_SESSION['nom_user'])) {
    header("location:" . BASE_URL . "/public/admin/connect.php");
}