NoShade.net est en vente — Contactez nous si vous êtes intéressé
Le siteTutoriauxInterviews
icone RSS NoShade.net

Accueil » Tutoriaux » PHP » Chapitre 5.2 : Exercice : Un système de login multi-membres

Les tutoriaux Php

5.2 Exercice : Un système de login multi-membres


Le principe



Dans ce cours, qui est plutôt un exercice à vrai dire, nous allons voir comment créer une zone protégée, où plusieurs personnes pourront se connecter, sous différents statuts. A savoir :
      - Invité : Très peu de possibilités
      - Membre : Quelques possibilités
      - Modérateur : Beaucoup de possibilités
      - Administrateur : Toutes les possibilités

Vous vous imaginez certainement que cela risque d'être complexe? Je dirais que non, c'est avant tout une question de logique, de raisonnement, pour savoir "ce qui est à faire", ainsi que "ce que nous allons utiliser comme code".

Le principe est assez simple.

Dans une base de données, nous allons enregistrer les utilisateurs de notre site.
Notre table, nous y reviendrons, contient donc en toute logique un champ "pseudo", "mot de passe", "email" ou ce que vous voulez, mais surtout, un champ "statut" qui lui ne contiendra qu'un chiffre.
      - Invité = 0
      - Membre = 1
      - Modérateur = 2
      - Administrateur = 3

Pourquoi ça?
Tout simplement, lors du login, nous allons récupérer ce chiffre dans la base de données, pour déterminer le statut de la personne qui se connecte. Nous mettrons ainsi ce chiffre en session, ce qui nous permettra de le réutiliser.

Il ne nous suffira ensuite qu'à donner des conditions lorsque nous protégerons nos pages.

"Si le visiteur à un statut de 2 ou plus (supérieur ou égal à 2), alors on affiche l'option pour éditer tous les messages du forum", par exemple.

Soit, si un modérateur (niveau 2) ou un administrateur (niveau 3) sont connectés, ils verront l'option "Éditer le message", tandis qu'un membre (niveau 1) ou un invité (niveau 0) ne le verront pas.

Plutôt bien pensé, non? ;)
Voyons donc cela avec plus de précision, en commençant par la structure de la base de données.


Du côté de MySQL...



Voici donc quelle forme aura notre table "membres" que vous allez créer sur PHPmyAdmin! ;)

id pseudo pass email statut
1 Traloula b247deafa97a5122eef246b489074c5d traloula23@hotmaille.com 3
2 Jasmin8 a5b106166ed1261ddd01534465fa3392 Jasmin8@wanaboo.com 1
3 Krogor d0ead673f8d72869c496a7b2557a89ba krogor@rogork.org 1
4 TrucMuche 8e03e182d6672dc4ae31d66245e5002b truc_muchhhh@monstersss.com 1
5 Bretzel 99c4c46d26f189b200e6f227d69f057c Bretzel@miam.com 2
6 PatéGras 267e8a85cfc7587a6c3d3a0d8051716d unidrivou@granouna.net 1
7 Brebis f31a81e91afdcf0b84dfee82ec2fb196 beehhhhhh@prairie.fr 1
8 Jimmy 79612480a3af5dc4aa74ea934e9d6ef6 Jimmy_neutron291@boiteamails.com 1


Hey!!! mais c'est quoi ton pass là c'est bizarre!!!! !
Ne vous inquiétez pas, nous allons en parler juste après, il s'agit d'un encodage de mot de passe... hé oui, toujours une question de sécurité! ;)
Considérez en attendant qu'il s'agit d'un mot de passe tout à fait normal.

Nous avons donc une colonne id, comme d'habitude, le pseudo, mot de passe et email stockés dans notre table, ainsi que ce fameux champ "statut", qui détermine le niveau de l'utilisateur.

En l'occurrence, si vous avez bien compris jusque là, Traloula est l'administrateur du site, tandis que Bretzel est un modérateur, tous les autres sont des membres.

Voilà pour ce qui est de la construction de la base de données, nous allons d'abord voir comment "encoder" le mot de passe saisi par l'utilisateur lors de son inscription avant que vous ne vous exerciez à créer une page d'inscription pour les visiteurs, ainsi que le début de notre "espace privé".


Encoder les mots de passes



Voyons comment encoder (ou "crypter") les mots de passes, chose bien utile pour éviter en partie les risques de piratage.

Pour encoder ces mots de passes, nous allons tout simplement utiliser une fonction (une seule suffira, oui).

Il en existe principalement deux qui sont les plus utilisées, md5() et sha1().

Voilà une portion de code simple pour vous montrer comment l'utiliser :

<?php
    
// Le mot de passe, qui pourrait etre simplement une variable $_POST['pass']
    
$pass "Canard2000";

    
// Nous allons ecrire ce mot de passe, encode en md5
    
echo md5($pass);
?>


Testez ce script, il vous retournera "a3d59f3a9ca77149d62687be39315c5f". Vous voyez une ressemblance avec "Canard2000" vous? :D
C'est très simple, un mot de passe md5 ne peut être lu en inversé.

Pour l'utilisation de sha1(), le principe est le même, et PHP nous retournera alors "230439a9857ef7fca495931cfb226d1c92e0686f". C'est un peu plus long, et ça revient au même, à vous de voir. ;)

Alors, imaginons que l'on soit psychopathe et que l'on ait envie de coder encore plus ce mot de passe, comment faire? :D

Nous pouvons par exemple rajouter une lettre avant le mot de passe, avant de l'enregistrer dans la base de données :

<?php
    $pass_envoye 
"Canard2000";
    
$pass_encode 'e' md5($pass_envoye);

    echo 
$pass_encode;
?>


Nous pouvons l'encoder deux fois de suite aussi, carrément une fois en sha1 et l'autre en md5, pourquoi pas?

<?php
    $pass_envoye 
"Canard2000";
    
$pass_encode md5(sha1($pass_envoye));

    echo 
$pass_encode;
?>


Il y a plusieurs astuces à inventer, même si elles ne sont pas spécialement utiles, autant l'avouer. :D

Au final, nous aurons donc un encodage :
- Lors de l'inscription du visiteur, on encode son mot de passe avant de l'enregistrer dans la base de données. Celui-ci sera donc stocké en tant que somme md5, si un membre venait à vous demander "Vous pouvez me rappeler mon mot de passe svp?", vous ne pourriez tout simplement même pas lui rappeler, il faudrait donc lui en définir un nouveau.
- Lors du login de notre visiteur qui s'identifie en tant que membre, puisqu'il s'est inscrit, nous allons encoder le mot de passe qu'il à saisi dans le champ "mot de passe" du formulaire de connexion, puis comparer ce mot de passe encodé avec celui stocké sur la base de données.
Il va donc être important d'utiliser exactement le même encodage pour les deux cas, sinon PHP ne pourra pas deviner que le mot de passe saisi est bien le même que celui sur la base de données.


Accès Invités / Membres / Modérateurs / Administrateurs



Maintenant, créez votre table, que nous nommerons "membres" sur PHPmyAdmin, puis, créez vos pages PHP. Nous aurons besoin pour tester ce script, de quelques pages :
- index.php > accueil du site, avec actualités par exemple, ainsi qu'un formulaire de connexion login + pass

- gestion_accueil.php > dans cette page, nous allons vérifier que le membre est bien inscrit, et que ses identifiants de connexions sont corrects. On aura donc une requête MySQL qui donnera quelque chose du genre : 'SELECT * FROM membres WHERE pseudo=' . htmlentities($_POST['pseudo'])
Nous créerons une boucle pour récupérer dans une variable $pass_bdd le mot de passe enregistré sur la base de donnée pour le membre dont le pseudo est celui qui a été envoyé.
Nous en ferons de même pour récupérer le statut du membre que nous placerons dans une variable $statut.
A noter la réapparition de la fonction htmlentities() sur nos variables $_POST, j'en avais parlé dans le chapitre 4.3, la revoilà. Il est en effet important de sécuriser tous les champs qu'un visiteur peut remplir lui même, pensez y systématiquement!

Si le compte existe, nous créerons plusieurs variables de sessions :
$_SESSION['Pseudo'] = le pseudo du membre
$_SESSION['Statut'] = Le statut du membre

Si vous voulez, créez également un cookie, je ne pense pas que ça soit nécessaire du tout, cela risque de vous gêner pour tester votre script plus tard, si vous souhaitez vous déconnecter et reconnecter sous un autre statut... à vous de voir. ;)

Le membre, identifié, sera alors autorisé à voir la page gestion_accueil.php. Dans le cas contraire, si le le compte n'existe pas, on peut l'amener sur une nouvelle page, par exemple gestion_inscription.php, pour que celui-ci s'inscrive sur le site.

Comment faire, pour détecter si MySQL n'a rien trouvé avec la requête qu'on lui a demandé?
Comme nous l'avons vu dans le cours 4.6 sur les statistiques, la fonction "mysql_num_rows()" sert à compter le nombre de résultats trouvés d'une requête MySQL.
Nous créerons donc une condition : if (mysql_num_rows($requete) == 0) { On fait un header pour rediriger le visiteur sur la page d'inscription }
C'est encore là une question de logique, ça vient rapidement à force de pratiquer, vous verrez! ;)

Nous restera à créer une page pour se déconnecter, par exemple "deconnexion.php".

Pour ce qui est de la page "gestion_accueil.php", notre but est donc d'afficher différents liens en fonctions des possibilités d'actions que l'on veut accorder à nos membres et modérateurs.

Côté code, nous pourrions donc avoir :

<?php

    
//============================================//
    //              LISTE DES STATUTS             //
    //============================================//
    //         MEMBRE = 1                         //
    //     MODERATEUR = 2                         //
    // ADMINISTRATEUR = 3                         //
    //============================================//




    //============================================//
    //                 MEMBRE = 1                 //
    //============================================//

if($_SESSION['Statut'] == 1)
{
// On lui souhaite la bienvenue
// Son pseudo etant egalement en session
echo 'Bienvenue ' $_SESSION['Pseudo'] . '!';
// On affiche les differentes actions qui lui sont accordees
?>
    <br />
    En tant que membre, vous pouvez :<br />
    - Créer un nouveau sujet de discussion<br />
    - Répondre à un sujet de discussion<br />
    - Créer un sondage<br />
<?php
}



    
//============================================//
    //               MODERATEUR = 2               //
    //============================================//

elseif($_SESSION['Statut'] == 2)
{
echo 
'Bienvenue ' $_SESSION['Pseudo'] . '!';
?>
    <br />
    En tant que modérateur, vous pouvez :<br />
    - Créer un nouveau sujet de discussion<br />
    - Répondre à un sujet de discussion<br />
    - Modifier un message dans les discussions<br />
    - Modifier l'intitulé d'une discussion<br />
    - Verrouiller une discussion<br />
    - Créer un sondage<br />
    - Verrouiller un sondage<br />
<?php
}



    
//============================================//
    //             ADMINISTRATEUR = 3             //
    //============================================//

elseif($_SESSION['Statut'] == 3)
{
echo 
'Bienvenue ' $_SESSION['Pseudo'] . '!';
?>
    <br />
    En tant qu'administrateur, vous pouvez :<br />
    - Créer de nouveaux groupes de discussions<br />
    - Modifier un groupe de discussions<br />
    - Créer un nouveau sujet de discussion<br />
    - Répondre à un sujet de discussion<br />
    - Modifier un message dans les discussions<br />
    - Modifier l'intitulé d'une discussion<br />
    - Verrouiller une discussion<br />
    - Supprimer une discussion<br />
    - Créer un sondage<br />
    - Verrouiller un sondage<br />
    - Supprimer un sondage<br />
    - Modifier le statut des membres<br />
    - Suspendre un membre<br />
    - Supprimer le compte d'un membre<br />
    - Bannir une adresse IP du forum<br />
<?php
}

else 
// Si le visiteur n'est pas connecte
{
    
header('Location: ./index.php');
}
?>


Ce n'est pas plus compliqué que ça! ;)
Nous devrons également protéger toutes nos pages de gestion, comme précédemment dans le cours 5.1.
Le principe est le même, vérifier la valeur d'une variable $_SESSION, et renvoyer le visiteur sur une autre page si cette variable n'existe pas, ou n'a pas la bonne valeur.
Pensez cependant à une chose dans le cas d'un accès à différents niveaux d'utilisateurs.
- Les membres ou modérateurs ne peuvent pas accéder à la page permettant de supprimer le compte d'un membre par exemple, si ils tapent l'adresse de cette page dans leur navigateur,
- L'administrateur, lui, peut aller sur les pages accessibles aux membres.

Utilisez donc toujours ce principe de conditions, par exemple, sur la page permettant de "modifier un message dans les discussions", accessible uniquement par les modérateurs et administrateurs, le code de protection pourrait donner :

<?php
/******************************
  Accessibilite de cette page :
            Visiteurs : NON
              Membres : NON
          Moderateurs : OUI
      Administrateurs : OUI
*******************************/
    
if ($_SESSION['Statut'] >= 2) { }
    else { 
header('Location: ./index.php'); }
?>


Voila, vous avez toutes les informations requises pour coder ce script, prenez votre temps, codez proprement, pensez à bien commenter votre code, n'hésitez pas à revenir sur nos cours pour chercher une information sur quelque chose qui vous aurai échappé... et surtout n'abandonnez pas! Bon courage à tous! ;)

Si votre script marche, c'est vraiment génial, ça veut dire qu'on à pas parlé totalement chinois depuis le début de ce cours. Vous pouvez dans ce cas continuer sur le cours suivant, sinon... Allez, on s'acharne un peu, ça va venir! ;)

Par : Legibe, le 1 octobre 2006

Sommaire du cours PHP

» Sommaire
» 1.1 Avant propos
» 1.2 Que faut'il pour faire du php?
» 2.1 Écrire du texte en PHP
» 2.2 Les commentaires, les variables et les calculs
» 2.3 Les conditions
» 2.4 La concaténation + Évaluation
» 3.1 Transmission de données
» 3.2 Les fonctions + Dates et heures
» 3.3 Les Arrays (tableaux) + les boucles
» 4.1 Les bases de données
» 4.2 Lecture dans une BDD
» 4.3 Enregistrer dans une BDD
» 4.4 Modifier le contenu d'une table
» 4.5 Supprimer du contenu dans une BDD
» 4.6 Statistiques
» 5.1 Les sessions et cookies
» 5.2 Exercice : Un système de login multi-membres