Introduction

Introduction – Un exemple d'utilisation

Tutorial pour Auth

Notre but dans ce "mini tutoriel " est de mettre en place un système qui sécurise votre site avec un mécanisme d'identification très simple.

En haut du site à sécuriser, placez ce petit bout de code:

Exemple typique d'utilisation de PEAR::Auth

<?php
require_once "Auth.php";

// Prend trois arguments : dernière utilisateur, le statut de l'autorisation
// et l'objet Auth
// Nous ne l'utilisons pas dans cette démonstration simple - mais vous pouvez
// l'utiliser pour faire d'autres choses.
function loginFunction($username null$status null, &$auth null)
{
    
/*
     * Changez la sortie HTML pour que cela s'intègre à votre application.
     */
    
echo "<form method=\"post\" action=\"test.php\">";
    echo 
"<input type=\"text\" name=\"username\">";
    echo 
"<input type=\"password\" name=\"password\">";
    echo 
"<input type=\"submit\">";
    echo 
"</form>";
}

$options = array(
   
'dsn' => "mysql://user:password@localhost/database",
);
$a = new Auth("DB"$options"loginFunction");

$a->start();

if (
$a->checkAuth()) {
    
/*
     * L'affichage de votre site va ici.
     */
}
?>

Ces quelques lignes de codes instantient le système d'identification.

La première ligne dans le script ci-dessus inclut le fichier depuis votre dossier PEAR. Il contient tout le code nécessaire pour exécuter PEAR::Auth. Puis, nous définissions une fonction pour afficher le formulaire d'identification que le visiteur utilisera pour entrer ses informations d'identification. Vous pouvez évidemment modifier le formattage HTML de cette fonction.

Vû que vous voulez utiliser une base de données pour vérifier les informations d'identification, nous créons maintenant la variable $dsn qui contient un DSN valide qui sera utilisé pour se connecter à la base de données via PEAR::DB. Pour le schéma par défaut des tables de la base de données ou pour utiliser une méthode de stockage différente, lisez ce qui suit.

Après cela, nous créons un objet d'identification. Le premier paramètre définit le nom du conténaire de stockage. Parce que nous voulons utiliser un conténaire de base de données pour le stockage, nous passons "DB" ici. Le second paramètre est le paramètre de connection pour le driver du conténaire. Nous utilisons donc le DSN précédemment défini. Le troisième paramètre est le nom de notre fonction qui nous avons définie au début du script. Elle affiche le formulaire d'identification.

Maintenant que notre objet d'identification est initialisé, nous devons vérifier si l'utilisateur est déjà connecté. Ce que nous faisons avec la fonction checkAuth(). Si elle retourne TRUE, nous pouvons passer le contenu de la page à l'utilisateur.

Utilisation d'une identification optionelle

<?php
// Dans ce test, le fichier est nommé "test.php".

require_once "Auth.php";

function 
loginFunction()
{
     
/*
      * Adaptez le HTML à votre application.
      */
     
echo "<form method=\"post\" action=\"test.php?login=1\">";
     echo 
"<input type=\"text\" name=\"username\">";
     echo 
"<input type=\"password\" name=\"password\">";
     echo 
"<input type=\"submit\">";
     echo 
"</form>";
}

if (isset(
$_GET['login']) && $_GET['login'] == 1) {
     
$optional true;
} else {
     
$optional false;
}

$options = array(
   
'dsn' => "mysql://user:password@localhost/database",
);
$a = new Auth("DB"$options"loginFunction"$optional);

$a->start();

echo 
"Tout le monde peut lire ce texte !<br />";

if (!isset(
$_GET['login'])) {
     echo 
"<a href=\"test.php?login=1\">Cliquez ici pour vous identifier.</a>\n";
}

if (
$a->getAuth()) {
     echo 
"Ce texte n'est affiché que si vous êtes identifié !";
}
?>

C'est un bon exemple pour montrer les fonctionnalités optionnelles d'identification : Le dernier paramètre $optional peut valoir soit TRUE, soit FALSE. S'il vaut FALSE, le formulaire d'identification n'est pas affiché et l'utilisateur ne verra que le texte :"Tout le monde peut lire ce texte !". S'il clique sur le lien en dessous de ce texte, il obtient la même page mais avecle paramètre GET "login=1". Maintenant, il peut entrer ses informations d'identification dans le formulaire. S'il s'identifie avec succès, il peut alors lire le texte : "Tout le monde peut lire ce texte !" ainsi que le texte :"Ce texte n'est lu que si vous êtes identifié !".

Fonctionnalité de déconnexion

L'exemple suivant effectue une "déconnexion" pour l'utilisateur courant et affiche de nouveau le formulaire d'identification.

<?php
$myauth
->start();
if (
$_GET['action'] == "logout" && $myauth->checkAuth()) {
    
$myauth->logout();
    
$myauth->start();
}
?>

Dans les passages suivants, nous allons voir plus d'informations détaillées sur les fonctions de la classe PEAR::Auth.

This SQL statement creates a table usable under the default database authentication scheme using MySQL:

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

Voici la table et les noms de champs nécessaires pour effectuer une identification. Lors du hashage du mot de passe avec l'algorithme md5, qui est la méthode de cryptage par défaut dans la classe PEAR::Auth, la colonne du mot de passe doit pouvoir accueillir 32 caractères de long. Lors de l'utilisation d'une autre méthode de cryptage comme DES ("UNIX crypt"), la taille de la colonne doit être modifiée en fonction.

Auth (Previous) Options for controlling the behaviour of Auth (Next)
Last updated: Sun, 29 Aug 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: marty@pagemiller.com
In the mini-tutorial, there is a section on optional authentication.

The var named $optional should be renamed $required.

The way the demo works, if $optional is true and is used as the fourth parameter, then login is required.

If you named the fourth parameter $required, and if it was false, login would not be required.

The variable name would make more sense to be named $required. Because if it is false, login is not required.

Just my $.02.
Note by: Happy_User
To Frustrated_User:

You're lack of using the Log functions is likely the only problem you have. I had the same issue as you. I turned on the Logging and voila! There was the problem!

(My table name was "Auth" and it was trying to use "auth" -- duh!)
Note by: Frustrated_User
Somehow I think your documentation lacks some essential points, I just get status -3 all the time (authentication failure), the database connection seems to work when I look at the print_r output from the Auth object. I don't get any error messages from the class nor from PHP itself, great job on making debugging easy, my compliments to you (and no, I don't want to use the PEAR::Log class, thanks).

The least thing you guys should do is update the example to use MDB2 instead of DB, I mean come on - how hard is that?? That's obviously the first thing everybody stumbles across.
Note by: niklas@...
A quick FYI for people who want to use the Auth package in a class and use a custom login function. Take the following example:

You have your userclass from which you call the Auth package. You want to use a function from your class as a custom login handler.

Auth.php uses PHPs is_callable to check if the function exists so it might be good to read up on http://php.net/manual/en/function.is-callable.php

The login-function variable can take an array if you need to call a certain class:

array($classreference, 'yourfunction')

I.e:

array($this, "loginFunction")

Or:

new Auth('MDB2', $this->options, array($this, "loginFunction"), $forcelogin);
Note by: chris@tactek.com
Not to be contrary, but the statement in the documentation that "...the MD5 algorithm...is the default encryption..." is a misnomer. Hashing is not encryption. Googling for "hashing is not encryption" will return numerous articles on this common misconception.
Note by: compufreak.info
ts@websafe.pl asked:

Isn't there an error?

$options = array(
'dsn' => "mysql://user:password@localhost/database",
);

right after /database", the comma is not needed, or am I wrong?

-----------------------

This is correct. The comma is not needed. But it is perfectly 'legal'! You may add a Comma after the last array-element. only, because if you add more elements, you won't forget the comma between the old element and the first new element. it will work and it is okay!
Note by: cronimson@yahoo.com
example does not work and i have in the internet for examples and all of them does not work also. can someone post a working sample.. this is frustrating.
Note by: wiesemann
@shelleykm..., please use the support offers on pear.php.net for asking support questions. About the usage of DB here: The example is just a little bit older. If you have suggestions about how it could be improved, please open a bug report via the link that is offered on the footer of this page (next to the link that you've used to file your user note).
Note by: wiesemann
@ts..., the comma isn't needed, that's right. But this isn't an error. PHP accepts the comma, and it makes people's life easier in some sense because you don't have to worry about adding the comma if you add another key/value pair to the $options array.
Note by: ts@websafe.pl
Isn't there an error?

$options = array(
'dsn' => "mysql://user:password@localhost/database",
);

right after /database", the comma is not needed, or am I wrong?
Note by: shelleykm@adelphia.net
Thanks to the above poster for the encryption hint. Unfortunately I don't have it working yet.

Also, why is the "DB" connector listed here? In the PEAR doc it even says DB has been deprecated in favor of MDB2. Why give newbies examples with includes that aren't recommended to use anymore?
Note by: Mario
Just adding one clarification for newbies (as I am).

If you want to test the 2 examples, don't forget that the password in your table must be encrypted.