Authentification avec PEAR::Auth

Le package Auth de pear est une petite bibliothèque permettant de faciliter la mise en oeuvre d'une authentification basée sur les cookies. Cet article a pour but de détailler l'implémentation de cette librairie sur votre site web. La liste des utilisateurs autorisés (avec leur mot de passe correspondant haché en MD5) est stockée en base de données.

Ce package peut s'interfacer avec des base de données, avec des annuaires tels que LDAP et avec un nombre incroyable de conteneurs. Plus de détails sur le site de pear .

Comment ça marche ?

Schéma du processus d'authentification:

Installation

Prérequis: le core de PEAR doit être installé et chargé. Pour plus d'informations et si vous êtes sur un hébergeur mutualisé, consulter l'article Installer PEAR chez un hébergeur mutualisé.

Télécharger l'archive à cette adresse : Auth . Décompressez la dans le dossier pear/Auth/; vous obtenez l'arborescence suivante:

Création de la table

Les utilisateurs seront stockés en base de données dans une table 'auth'. Utilisez le code suivant pour créer la table avec les champs nécessaires.

 
CREATE TABLE auth (
   username VARCHAR(50) DEFAULT '' NOT NULL,
   password VARCHAR(32) DEFAULT '' NOT NULL,
   PRIMARY KEY (username),
   KEY (password)
 
);

Vous devez évidement posséder une "couche" de connexion à votre base de données (database layer). J'ai choisi d'utiliser MDB2, un autre package pear, mais vous pouvez choisir celui qui répond le plus a vos besoins. Pour plus d'informations sur MDB2 et comment l'installer référez vous à cet article Utiliser Pear::MDB2 pour accèder à votre base de donnés.

Mise en place de l'authentification

Sur chacune des pages de vos sites il va falloir placer le code ci-dessous. Pour cela, créer un fichier application.php à inclure dans vos scripts et placer y le code suivant:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Authentification: inclusion de la librairie
require_once "Auth/Auth.php";// Les infos de connexion a la base de donnees
 
// Format: mysql://utilisateur:mot_de_passe@hote/base_de_donnees
$dsn = "mysql://root:pass@localhost/database";
 
// Paramétres de l'authentification
$params = array(
"dsn" = $dsn,
"table" = "auth",
"usernamecol" = "username",
"passwordcol" = "password",
"cryptType" = "md5",
"db_fields" = "*"
);
 
// false - n'affiche pas la fonction
$a = new Auth("MDB2", $params, "loginFunction", false);
 
// Pour la gestion de la deconnexion
if($_GET['act'] == "logout")
  $a->logout();
 
//Lancement du process d'auth
$a->start();
 
function loginFailed (){
  echo 'Login ou pass invalide';
}
 
$a->setFailedLoginCallback("loginFailed");

Explications:

  • table est le nom de la table que l'on a crée précédement et qui contient les utilisateurs (dans notre cas 'auth')
  • usernamecol est le nom du champs contenant le nom d'utilisateur (dans notre cas 'username')
  • passwordcol est le nom du champs contenant le mot de passe de l'utilisateur (dans notre cas 'password')
  • cryptType désigne le type de hachage à adopter pour stocker le mot de passe ; ici on utilise MD5
  • db_fields désigne les champs que l'on veut récupérer en même temps que la requête qui vérifie si l'utilisateur peut se connecter. * signifie tous.

Les autres paramètres parlent d'eux même c'est pourquoi je ne les détaillerai pas.

Quelque astuces à connaître:

  • Pour savoir si une personne est loggée, utiliser la fontion getAuth()
 
if ($a->getAuth()) {
  // Code si loggé
}
else {
  // Code si non loggé
}
  • Comptes nécessitant une activation: supposons que pour que les utilisateurs puissent se connecter sur votre site, ils doivent possèder un compte activé. Par exemple, cela se traduit par un booleen actif à 0 ou 1 dans la base de données (O si inactif, un si actif). Il faut donc changer la requête d'authentification (et bien sûr ajouter le champ actif dans la table auth). Pour cela éditer le fichier pear/Auth/Container/MDB2.php et remplacer la ligne:
 
$query = sprintf("SELECT %s FROM %s WHERE %s = %s", []

par:

 
$query = sprintf("SELECT %s FROM %s WHERE actif = '1′ AND %s = %s", []
  • Enfin pour gérer les différents problèmes d'authentification qui peuvent subvenir (tels que un mauvais login ou pass, une session expirée, …) utilisez le bout de code ci-dessous à l'endroit ou vous souhaitez afficher les messages:
 
1
2
3
4
5
6
7
8
9
10
11
$status = "";
if (isset($a) AND ($a->getStatus() != 0)) {
  switch ($a->getStatus()) {
    case AUTH_WRONG_LOGIN : $status = "Login ou pass invalide"; break;
    case AUTH_EXPIRED : $status = "Session expirée"; break;
    case AUTH_IDLED : $status = "Inactivité trop longue"; break;
    case AUTH_SECURITY_BREACH : $status = "Problème de securite"; break;
    default : echo "Message";
  }
}
echo $status;

Exemple simple d'utilisation:

Un exemple complet qui illustre les détails expliqués ci-dessus:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
// On inclut le fichier contenant l'initialisation de l'authent
require_once "application.php";
 
if($a->getAuth()) {
  echo "Hourra! Je suis loggé";
} else {
  echo "Formulaire d'accés:";
  $status = "";
  if (!empty($a->status) AND $a->status == AUTH_EXPIRED) {
    $status = "Session expirée";
  } else if (!empty($a->status) AND $a->status == AUTH_IDLED) {
    $status = "Inactivité trop longue";
  } else if (!empty ($a->status) AND $a->status == AUTH_WRONG_LOGIN) {
    $status = "Login ou pass invalide";
  } else if (!empty ($a->status) AND $a->status == AUTH_SECURITY_BREACH) {
    $status = "Probleme de securite";
  }
 
// Les erreurs eventuelles
echo $status;
?>
 
<!-- Le formulaire-->
<form method="post" action="index.php">
<label>Login</label>
<input name="username" size="15" value="'" type="text" />
<label>Pass</label>
<input name="password" size="15" type="password" />
<input name="auth" id="auth" value="ENVOYER" class="button" type="submit" />
</form>
 
<?php } ?>

Maintenant il ne vous reste plus qua mettre un utilisateur et son mot de passe dans la base de donnée et tester le tout !! Bonne chance!

A lire également

Filed under: PHP
Tags: , , ,

Leave a Reply