TUTORIELS 
Méthodologie de personnalisation web en PHP
Les structures de quelques fichiers composant un système d'inscription de membres et d'authentification permettant, par le biais des sessions, de manipuler des variables globales propres à l'utilisateur connecté.  (26 mars 2002)
 

Page 1 | 2

Par "personnalisation", nous entendons la mise à disposition de certains services (éditoriaux ou applicatifs) en fonction de l'utilisateur.
Il existe plusieurs méthodes pour repérer de manière unique un internaute qui se connecte sur un site web:
- les "cookies", tout d'abord, dont l'intérêt est de ne pas contraindre l'utilisateur à s'identifier lors de chaque visite;
- et les sessions, système n'excluant d'ailleurs pas les cookies, mais qui permettent aussi de s'en affranchir totalement, avec l'inconvénient cette fois d'une identification à chaque visite.

Rappels sur les sessions

Nous avons déjà traité des sessions, aussi bien en PHP3 qu'en PHP4, mais sans les replacer dans leur contexte global, qui est celui de l'authentification d'un utilisateur, et de la mise en rapport de son profil, stocké en base de données, avec les informations saisies lors de la connexion. Cette mise en rapport étant le critère d'ouverture d'une session.
Notre but ici n'est pas de fournir un système complet de gestion de membres et de sessions, mais de proposer une structure-cadre incluant les différents fichiers qui devront être mis en jeu.

Rappelons que tous les fichiers (PHP) dans lesquels ont utilisera des informations de session devront débuter, avant tout autre chose, par la ligne:

<?session_start();?>

permettant de récupérer, au sein de la page, les informations caractérisant la session en cours (celles-ci étant stockées dans un fichier sur le serveur). Nous laissons de côté ici, dans un souçi de simplification, les sessions "nommées" et le stockage en base de données des "identifiants de session" (voir les tutoriels consacrés spécifiquement aux sessions en PHP).

Authentification, ouverture et fermeture de session

Imaginons que l'identification de l'utilisateur soit permise par une boite de dialogue figurant, par exemple, dans le fichier .php contenant l'en-tête de page (commun à l'ensemble du site) ou la colonne de gauche (commune, elle aussi, à l'ensemble du site). (Ces choix "d'architecture" sont représentatifs d'un grand nombre de sites, c'est pourquoi nous les mentionnons ici. Il en existe bien sûr d'autres.)

Un tel fichier (nous l'appelerons login.php) aura la structure suivante, en supposant qu'une session ouverte par un membre authentifié implique l'enregistrement dans la session de la variable $userid, contenant l'identifiant du membre en question:

// affichage du code HTML précédant le formulaire d'identification

<?
if(!session_is_registered("userid")) { // test si un membre est connecté ou pas
?>
<form action="/authentification.php" method="POST"> // début du formulaire
// affichage des différents champs de formulaire:
Identifiant: <input type="text" name="userid"><br>
Mot de passe: <input type="password" name="userpass">
<input type="submit" value="OK">
</form>
<a href="/register.php">S'inscrire</a>
// lien vers le formulaire d'inscription
<?
}else{ // si le membre est déjà connecté alors...
?>
// Affichage d'un message de bienvenue, par exemple:
Bienvenue <?echo $userid;?>!<br>
<a href="/register.php">Modifier mon profil</a> - <a href="logout.php">Fermer la session</a>
<?
}

?>

// affichage du code HTML suivant le formulaire d'indentification

Bien sûr, ce fichier (en-tête de page, colonne de gauche, etc.) sera appelé (grâce à un <?include "login.php";?>) par un fichier contenant l'instruction <?session_start();?> comme indiqué plus haut.

login.php pointe vers trois fichiers: authentification.php lors de la validation du formulaire, register.php en cas d'inscription ou de modification du profil (voir plus loin), enfin logout.php pour fermer la session.

Le premier (authentification.php) aura la structure suivante:

<?
session_start();
if(session_is_registered("userid")){
  // déjà connecté (peut se produire en cas d'appel direct du script): redirection vers une page d'erreur ou la homepage
  $url="/index.php";

}else{

  $userpass=md5($userpass); // cryptage md5 du mot de passe (par exemple)

  // instructions de connexion à la base de donnée

  $requete_sql="SELECT userid,userpass[,usermail,...] FROM membres"; // requête SQL de rappatriement des identifiants et mots de passe (nous supposons la table appelée "membres"), plus éventuellement d'autres informations (e-mail,etc.)
  $resultat=mysql_query($requete_sql, $connect); // où $connect est la variable caractérisant la connexion établie plus haut
  $ok=0;
  while($user=mysql_fetch_array($resultat)){
    if(!strcmp($userid,$user[userid]) && !strcmp($userpass,$user[userpass]){
      $ok=1;
// il y a correspondance à la fois de l'indentifiant et du mot de passe crypté
      $usermail=$user[usermail]; //etc...
    }
  }
  if($ok){
    session_register("userid");
// enregistrement de l'identifiant dans la session
    // éventuellement, enregistrement dans la session d'informations complémentaires, par exemple:
    session_register("usermail");
    $url="/confimation.php";
// redirection vers une page de confirmation...
  } else{
    $url="/echec.php";
// ou vers une page d'erreur si l'authentification a échoué
  }
}  
header("location: $url");
?>

On peut compléter ce script en y ajoutant des instructions de validation de l'identifiant et du mot de passe (taille minimale, maximale, etc.)

Avant de s'intéresser à la phase d'inscription, examinons le fichier logout.php qui va nous permettre de terminer une session déjà ouverte.

<?
session_start();
if(session_is_registered("userid")){
  // déjà connecté (peut se produire en cas d'appel direct du script): redirection vers une page d'erreur ou la homepage
  $url="/index.php";

}else{

  
session_close(); // termine la session en cours, toutes les variables globales associées sont supprimées
  $url="$HTTP_REFERER"; // redirection vers la page où l'utilisateur à décidé de terminer sa session
}  
header("location: $url");
?>

Page 1 | 2

 
[ Jérôme Morlon,JDNet
 
Accueil | Haut de page