Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (@plv) Dernière mise à jour : 27 March 2007

Initiation à Zend_Auth

Introduction

ATTENTION : ne fonctionne qu'en ZF 0.9.1 ou plus !!

Ce tutoriel est un exemple d'utilisation pour une authentification simple avec un login et un mot de passe. Il montre les points suivants :

  • création d'un adaptateur (utilisation de Zend_Auth_Result et Zend_Auth_Adapter_Interface)
  • utilisation de Zend_Auth
  • identification avec login/password
  • sauvegarde en session
  • logoff

Ce code est épuré au maximum pour se concentrer sur Zend_Auth. Pour des raisons de sécurité, il faudrait valider avec Zend_Validate les données POST et GET envoyées au controller.

Principe

Ce code est une page d'authentification simple. On peut faire les actions suivantes :

  • s'identifier avec un login et un mot de passe (le seul compte valide est : foo/bar)
  • recharger la page
  • se déconnecter

Dans ce code, le login et le mot de passe sont inscrits en durs dans l'adapteur. Bien sur dans un cas réel, il faudra aller les chercher dans une base de données par exemple...

Organisation du code

Le code se divise en grandes parties :

  • Initialisation du Zend Framework
  • Définition de notre adapteur
    • C'est une classe indiquant comment faire l'authentification
  • Définition du controller
    • Il prendra en compte les requêtes GET et POST de l'application
  • La vue
    • elle affiche la page

Analysons un peu plus les parties intéressantes du code :

  • Un adapteur est une classe qui doit définir la méthode authenticate. Cette méthode renvoie un objet Zend_Auth_Result qui est utilisé par la suite dans l'applicatif pour savoir si l'authentification s'est bien passée. C'est la seule méthode obligatoire.
  • Dans le controlleur, on a deux traitements possibles :
    • Identification
      • On reçoit en POST le login et le password
      • On regarde s'ils sont bons ou non en utilisant Zend_Auth::getInstance()->authenticate()
      • On fait une redirection 302 (Location:...) vers la page suivante (ici la même page) pour éviter le problème ergonomique de repostage des données (certains voient en cette méthode le mal incarné... ça n'est pas l'objet de ce tutoriel...)
    • Deconnexion
      • Si le script reçoit en GET le paramètre action="logoff", on déconnecte l'internaute...
  • Dans la vue
    • On récupère l'identité de l'internaute s'il est identifié
    • On récupère les messages d'erreur
    • On affiche la page
<?php
/*
 * Created on 22 mars 07
 *
 * @author Philippe Le Van (http://www.kitpages.fr)
 * @copyright 2005-2007
 */
 
////
// INITIALISATION DU Zend Framework
set_include_path(
  ".;".
  "C:/users/levan/_boulot/phplib/ZendFramework-0.9.1-Beta/library;".
  get_include_path()
);
 
require_once 'Zend/Loader.php';
 
Zend_Loader::loadClass("Zend_Auth");
Zend_Loader::loadClass("Zend_Auth_Result");
Zend_Loader::loadClass("Zend_Auth_Adapter_Interface");
 
////
// définition de mon adapteur
////
class Kitpages_Auth_SimpleAdapter
    implements Zend_Auth_Adapter_Interface {
 
    const LOGIN="foo";
    const PASSWORD="bar";
 
    private $login=null;
    private $pass=null;
 
    public function __construct($login, $pass) {
        $this->login = $login;
        $this->pass = $pass;
    }
 
    public function authenticate() {
        // imaginez ici qu'on fait une requête
        // en base pour vérifier si le login/pass
        // est bon...
        if ( ($this->login == self::LOGIN) &&
             ($this->pass == self::PASSWORD) ) {
            $res = new Zend_Auth_Result(
                Zend_Auth_Result::SUCCESS,
                $this->login,
                array()
            );
            return $res;
        }
        else {
            $res = new Zend_Auth_Result(
                Zend_Auth_Result::FAILURE,
                null,
                array("mauvais login ou password")
            );
            return $res;
        }
    }
}
 
$auth = Zend_Auth::getInstance();
////
// CONTROLLER
////
// si un login pass a été posté
if (isset($_POST["login"])) {
    // récupérons les données de l'internaute
    // pour le bien il faudrait utiliser Zend_Validate ici...
    $login = $_POST["login"];
    $pass = $_POST["pass"];
 
    $kitAdapter = new Kitpages_Auth_SimpleAdapter($login,$pass);
    $result = $auth->authenticate($kitAdapter);
    if (!$result->isValid()) {
        header("Location: ".
               $_SERVER["SCRIPT_NAME"].
               "?message=wrong_login_or_pass");
        exit();
    }
    header("Location: ".$_SERVER["SCRIPT_NAME"]);
    exit();
}
 
// si une action
if ( isset($_GET["action"]) && ($_GET["action"]=="logoff") ) {
    $auth->clearIdentity();
}
 
////
// VUE
////
if ($auth->hasIdentity()) {
    $member = $auth->getIdentity();
    echo "Bonjour ".$member."<br/>";
}
else {
    $member = null;
    echo "Vous n'êtes pas identifié<br/>";
}
// afficher les messages d'erreur
if (isset($_GET["message"])) {
    // hum... là aussi il faudrait valider ce $_GET...
    echo "<b>".$_GET["message"]."</b><br/>";
}
 
?>
<form action="<?php echo $_SERVER["SCRIPT_NAME"];?>" method="post">
    login:<input name="login" type="text" value=""><br/>
    password:<input name="pass" type="password" value=""><br/>
    <input type="submit" value="s'identifier">
</form>
<a href="?action=logoff">se déconnecter</a>

Conclusion

D'abord, ce code n'est pas à utiliser tel quel en production : il faut valider (avec Zend_Validate et éventuellement Zend_Filter) les données envoyées en POST ou en GET au controller.

J'ai tout mis dans un seul fichier pour les besoin du tutoriel. Maintenant, tant qu'à faire d'avoir un controller et une vue, il vaudrait mieux utiliser le MVC du Zend Framework, mais l'objet de ce tutoriel était Zend_Auth.

J'espère que ce tutoriel vous semble suffisament clair.

La doc officielle : http://framework.zend.com/manual/en/zend.auth.html

Commentaires

Ajouter un commentaire