2. Mise en place d'une authentification

Sécurisation du back-office en PHP

Principe de la sécurisation d'un backoffice

Nous allons mettre en place un système de login afin de protégrer une partie du site. Pour cela nous allons avoir besoin des éléments suivants :

  • Une table contenant les informations sur les utilisateurs (login, mot de passe, ...)

  • Un formulaire de connexion et sa page de traitement (donc un contrôleur, des routes associées et les vues)

  • Un test sur chacune des pages à protéger pour vérifier que l'utilisateur est connecté

  • Une page de déconnexion

Pour réaliser cette partie, nous allons utiliser les sessions, afin de mémoriser le fait qu'un utilisateur soit connecté. Cela évitera de lui demdander sur chaque page de se connecter.

La table 'utilisateurs'

Cette table doit contenir, a minima, 3 champs :

  • Un ID (id), unique, auto incréménté

  • Un login (login), qui devrait être unique (unique) et de type texte. Il peut s'agir d'un email, un username, ...

  • Un mot de passe (password), qui sera du texte

  • Tous les champs que vous pourriez trouver utile (mail, nom, ...)

Le mot de passe devra être crypté. Vous pouvez (devez) utiliser les fonctions PHP comme : https://www.php.net/manual/fr/function.password-hash.php

Travail à faire

  • Créer cette table dans votre base de données.

  • Créér le model associé (Utilisateurs.php)

  • Ajoutez manuellement (insérer) un ou plusieurs utilisateurs. Ecrivez un petit script PHP qui utilise la fonction https://www.php.net/manual/fr/function.password-hash.php pour crypter votre mot de passe. Copier/Coller le résultat comme mot de passe dans votre BDD.

Exemple de script PHP :

<?php
$options = [
    'cost' => 12,
];
echo password_hash("votremotdepase", PASSWORD_BCRYPT, $options);
?>

Formulaire de connexion

Le formulaire de connexion doit contenir deux champs (login et mot de passe), et envoyer vers une page de traitement. Il doit être accessible depuis toutes les pages du site, il conviendra donc d'ajouter un lien dans le menu vers cette page.

Travail à faire

  • Créer un controller (par exemple Login.php), et une route index pour votre formulaire de connexion. Cette méthode doit simplement retourner la vue avec le formulaire.

  • Ajouter la vue correspondante

  • Le formulaire doit renvoyer (attribut action), par exemple vers login/connexion qui sera la méthode dans votre controller login qui va vérifier les informations.

Le traitement du formulaire de connexion

  • Le traitement doit effectuer la vérification des informations. Il doit rechercher dans la base de données si un utilisateur correspond au couple login/mot de passe.

    • Il faut donc effectuer une requête pour récupérer l'utilisateur par rapport à son login, puis vérifier que le mot de passe saisi correspond au mot de passe crypté dans la base de données.

    • Si la vérification est réussie alors, on sauvegarde une session pour mémoriser l'utilisateur. On peut ensuite le rediriger vers une page. Dans le cas contraire, on peut le rediriger vers la page de connexion avec un message d'erreur.

On peut sauvegarder ici le login de l'utilisateur dans la session. Cette technique fonctionne, mais l'usage voudrait qu'on sauvegarde plutôt une clé générée automatiquement et stockée dans la base de données et dans la session. De cette manière le login n'est pas utilisé, et la clé change à chaque connexion.

Travail à faire

  • Mettre en place la partie traitement.

Vérification sur les pages administrations

Il va maintenant falloir vérifier sur chacune des pages que l'on souhaite sécuriser que l'utilisateur est bien connecté. Si c'est le cas, on le laissera visualiser la page, sinon, on le redirigera.

On pourrait écrire et dupliquer le code sur chacune des pages, mais cela ne serait pas très professionnel. On va donc ajouter une méthode dans le fichier Controller.php dont nos contrôleurs héritent va vérifier les éléments, et cette méthode sera appelée sur toutes les routes à sécuriser.

Le méthode pourrait se nommer isAccessGranted, et prendre en paramètre le nom du modèle (Utilisateurs).

On ajoutera ensuite, au tout début de chacune des routes, à sécuriser, un appel à cette méthode

Travail à faire.

  • Mettre en place cette vérification sur l'ensemble des pages à sécuriser.

  • Faire valider le bon fonctionnement

Améliorations possibles

Cette solution est basique. On pourrait l'améliorer en gérant des permissions par exemple pour distinguer un client, d'un administrateur (gestion d'une notion de rôle ou de droit). On pourrait aussi gérer la création d'un compte, ou encore le mot de passe perdu, ...

Last updated