Coding Samples, Tutorials, Code Snippets, Articles, How-To`s - From Beginners to Expert. Stay tuned.
Share your knowledge. Regardless what experience you have made with the Zend Framework - Let all benefit.

Search Manual:

Please Sign in or Register

Available Languages

 


Manual for Zend Framework 1.0.3

Chapitre 3. Zend_Auth

3.1. Introduction

Zend_Auth fournit une API pour l'authentification et inclut des adaptateurs concrets d'authentification pour les cas les plus courants.

Zend_Auth est uniquement concerné par le processus d'authentification et non pas par le processus d'autorisation. L'authentification est définie de manière lâche (souple) afin de déterminer si une entité donnée est bien celle qu'elle prétend être (c.-à-d. identification), sur la base d'identifiants donnés. L'autorisation, l'action de décider si une entité donnée peut accéder à d'autres entités et/ou exécuter des opérations sur celles-ci ne fait pas partie des prérogatives de Zend_Auth. Pour plus d'informations sur les autorisations et le contrôle d'accès via le Zend Framework, voyez Zend_Acl.

[Note] Note

La classe Zend_Auth inclut un singleton -uniquement une instance de la classe est disponible- à travers la méthode statique getInstance(). Celle ci utilise un nouvel opérateur et le clone des mots clés ne fonctionnera pas avec la classe Zend_Auth, utilisez getInstance() à la place.

3.1.1. Adaptateurs

Un adaptateur Zend_Auth est utilisé pour authentifier un service particulier d'authentification, comme LDAP, RDBMS ou un stockage basé sur des fichiers. Les différents adaptateurs peuvent posséder des options et des comportements très divers. Cependant, quelques méthodes de base leur sont communes. Par exemple, accepter des éléments d'authentification (incluant une identité prétendue), authentifier et retourner un résultat sont des éléments communs aux adaptateurs Zend_Auth.

Chaque classe d'authentification, adaptateur de Zend_Auth implémente Zend_Auth_Adapter_Interface. Cette interface définit une méthode, authenticate, celle-ci est implémentée par une classe adaptateur à fin de l'authentification. Chaque classe adaptateur doit être préparée avant tout appel de authenticate(). Cela implique que chaque adaptateur fournisse la possibilité de définir des éléments d'authentification (par exemple identifiant et mot de passe) et de définir des valeurs pour les options spécifiques de l'adaptateurs, tels que les paramètres de connexion à une base de données pour un adaptateur qui en fait usage.

L'exemple suivant est un adaptateur d'authentification qui requiert un identifiant et un mot de passe. D'autres détails, tel que la manière d'interroger le service d'authentification, ont été omis par souci de clarté :

<?php
require_once 'Zend/Auth/Adapter/Interface.php';

class MonAdaptateurAuth implements Zend_Auth_Adapter_Interface
{
    /**
     * Définition de l'identifiant et du mot de passe pour authentification
     *
     * @return void
     */
    public function __construct($identifiant, $motdepasse)
    {
        // ...
    }

    /**
     * Réalise une tentative d'authentification
     *
     * @throws Zend_Auth_Adapter_Exception si l'authentification ne peut pas être réalisée
     * @return Zend_Auth_Result
     */
    public function authenticate()
    {
        // ...
    }
}
    		

Comme indiqué dans le bloc de documentation, authenticate() doit retourner une instance de Zend_Auth_Result (ou d'une classe derivée de Zend_Auth_Result). Si pour quelque raison que ce soit, la requête d'authentification ne peut pas être réalisée, authenticate() retournera une exception dérivée de Zend_Auth_Adapter_Exception.

3.1.2. Resultats

Les adaptateurs Zend_Auth retournent une instance de Zend_Auth_Result via authenticate() de manière à présenter les résultats d'une tentative d'authentification. Les adaptateurs alimentent l'objet Zend_Auth_Result lors de sa construction, de manière à ce que les trois méthodes suivantes fournissent un lot de base d'opérations communes aux résultats des adaptateurs Zend_Auth :

  • isValid() - retourne true si et seulement si le résultat représente une tentative réussie d'authentification

  • getCode() - retourne une constante Zend_Auth_Result qui détermine le type de retour accepté ou refusé (ndt : voir tableau ci dessous).. Cela peut être utiliser pour les développeur voulant distinguer en amont le résultat. Il est possible d'avoir des statistiques détaillées, par exemple. Une autre utilisation est de personnaliser le message de retour au client. Attention de ne pas trop donner de détails aux clients pour des raisons de sécurité. Pour plus de détail consulter les notes ci dessous.

  • getIdentity() - retourne l'identité de la tentative d'authentification.

  • getMessages() - retourne un tableau de messages relatifs à une tentative infructueuse d'authentification.

Un développeur peut connecté le résultat de l'authentification avec des opérations spécifiques. Certaines opérations développées peuvent regarder le compte après plusieurs refus du mot de passe, marquer une adresse IP après plusieurs essais sur des compte inexistants et de fournir un message spécifique à l'utilisateur final. Les codes suivants sont disponibles :

Zend_Auth_Result::SUCCESS
Zend_Auth_Result::FAILURE
Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
Zend_Auth_Result::FAILURE_UNCATEGORIZED
    		

L'exemple suivant illustre comment utiliser le retour :

<?php
// A l'interieur de la méthode AuthController / loginAction
$result = $this->_auth->authenticate($adapter);

switch ($result->getCode()) {

    case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
        /** l'identifiant n'existe pas **/
        break;

    case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
        /** mauvaise authentification **/
        break;

    case Zend_Auth_Result::SUCCESS:
        /** authentification acceptée **/
        break;

    default:
        /** autres cas **/
        break;
}
    		

3.1.3. Persistance d'identité

Authentifier une requête qui contient des paramètres d'authentification est utiles en soi, mais il est également important de permettre le maintient de l'identité authentifiée sans avoir à présenter ces paramètres d'authentification à chaque requête.

HTTP est un protocole sans état, cependant, des techniques telles que les cookies ou les sessions ont été développées de manière à faciliter le maintien d'un contexte lors de multiples requêtes dans les applications web.

3.1.3.1. Persitence par défaut dans une session PHP

Zend_Session est utilisé par Zend_Auth pour fournir un stockage persistant de l'identité, après une authentification réussie, via les sessions PHP. Après une authentification réussie, Zend_Auth::authenticate() conserve l'identité résultant de l'authentification dans un stockage persistant. Par défaut, Zend_Auth utilise une classe de stockage basée sur Zend_Session. La classe de stockage peut être changée en fournissant un objet de stockage différent à Zend_Auth::setStorage(). Une classe personnalisée peut fournir une implémentation de l'objet Zend_Auth_Storage_Interface à Zend_Auth::setStorage().

[Note] Note

Si la persistance automatique de l'identité n'est pas souhaitable dans un cas particulier, alors le développeur peut renoncer à utiliser la classe Zend_Auth et préférer utiliser directement une classe adaptateur.

Exemple 3.1. Changer l'espace de nomage de la session

Zend_Auth_Storage_Session utilise un espace de nomage de 'Zend_Auth'. Cet espace peut être écrit en passant les valeurs au constructeur de Zend_Auth_Storage_Session, et ces valeurs sont passées en interne au constructeur de Zend_Session_Namespace. Cela doit être fait avant l'authentification, aprés que Zend_Auth::authenticate() ait accompli le stockage automatique de l'identité.

<?php
// Sauver une référence du singleton, instance de Zend_Auth
require_once 'Zend/Auth.php';
$auth = Zend_Auth::getInstance();

// Utiliser 'someNamespace' instance de 'Zend_Auth'
require_once 'Zend/Auth/Storage/Session.php';
$auth->setStorage(new Zend_Auth_Storage_Session('someNamespace'));

/**
 * @todo Set up the auth adapter, $authAdapter
 */

// authentification, sauvegarde du résultat et stockage du résultat en cas de succès
$result = $auth->authenticate($authAdapter);
    				


3.1.3.2. Installer un stockage personnalisé

Parfois les développeurs ont besoin de plusieurs authentifications fourni par : Zend_Auth_Storage_Session. Dans ces cas, les développeurs implémentent simplement Zend_Auth_Storage_Interface et fournit une instance dela classe à Zend_Auth::setStorage().

Exemple 3.2. Utiliser une classe de stockage personnalisée

Pour utiliser une classe de stockage d'identité persistante autre que Zend_Auth_Storage_Session, le développeur commence par implémenter Zend_Auth_Storage_Interface:

<?php
require_once 'Zend/Auth/Storage/Interface.php';

class MyStorage implements Zend_Auth_Storage_Interface
{
    /**
     * Retourne true si et seulement si le stockage est vide
     *
     * @throws Zend_Auth_Storage_Exception Si c'est possible de determiner quand le stockage est vide
     * @return boolean
     */
    public function isEmpty()
    {
        /**
         * @todo implementation
         */
    }

    /**
     * Retourne le contenu du stockage
     *
     * Comportement à définir si le stockage est vide.
     *
     * @throws Zend_Auth_Storage_Exception Si la llecture du stockage est possible
     * @return mixed
     */
    public function read()
    {
        /**
         * @todo implementation
         */
    }

    /**
     * Ecrit $contents dans le stockage
     *
     * @param  mixed $contents
     * @throws Zend_Auth_Storage_Exception si l'écriture de $contents est impossible
     * @return void
     */
    public function write($contents)
    {
        /**
         * @todo implementation
         */
    }

    /**
     * RAZ du stockage
     *
     * @throws Zend_Auth_Storage_Exception Si la remise à zéro (RAZ) est impossible
     * @return void
     */
    public function clear()
    {
        /**
         * @todo implementation
         */
    }

}
    				

Ensuite la classe personnalisée est invoquée, avant la requête d'authentification, avec Zend_Auth::setStorage() :

<?php
// Definit la classe personnalisée à utiliser
Zend_Auth::getInstance()->setStorage(new MyStorage());

/**
 * @todo Set up the auth adapter, $authAdapter
 */

// Authentification, sauvegarde et persistance du résultat en cas de succès.
$result = Zend_Auth::getInstance()->authenticate($authAdapter);
    				


3.1.4. Utilisation de Zend_Auth

Deux manières d'utiliser les adaptateurs Zend_Auth sont fournies

  1. indirectement, via Zend_Auth::authenticate()

  2. directement, via la méthode authenticate() de l'adaptateur

L'exemple suivant illustre la manière d'utiliser un adaptateur Zend_Auth de manière indirecte via l'utilisation de la classe Zend_Auth :

<?php
// Obtention d'une référence de l'instance du singleton de Zend_Auth
require_once 'Zend/Auth.php';
$auth = Zend_Auth::getInstance();

// Définition de l'adaptateur d'authentification
$authAdaptateur = new MonAdaptateurAuth($identifiant, $motdepasse);

// Tentative d'authentification et stockage du résultat
$resultat = $auth->authenticate($authAdaptateur);

if (!$resultat->isValid()) {
    // échec de l'authentification ; afficher pourquoi
    foreach ($resultat->getMessages() as $message) {
        echo "$message\n";
    }
} else {
    // Authentification réussie ; l'identité ($identifiant) est stockée dans la session
    // $resultat->getIdentity() === $auth->getIdentity()
    // $resultat->getIdentity() === $identifiant
}
    		

Une fois la tentative d'authentification réalisée, tel que montré ci-dessus, il est très simple de vérifier si une identité correctement authentifiée existe :

<?php
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // l'identité existe ; on la récupère
    $identite = $auth->getIdentity();
}
    		

Pour retirer une identité du stockage persistant, utilisez simplement la méthode clearIdentity(). A utiliser typiquement pour implémenter une opération de déconnexion d'une application :

<?php
Zend_Auth::getInstance()->clearIdentity();
    

Quand l'utilisation automatique du stockage persistant n'est pas appropriée, le développeur peut simplement contourner l'utilisation de la classe Zend_Auth en utilisant directement une classe adaptateur. L'usage direct d'une classe adaptateur implique de configurer et préparer l'objet de l'adaptateur et d'appeler ensuite sa méthode authenticate(). Les détails spécifiques à un adaptateur sont décrits dans la documentation de chacun d'entre-eux. L'exemple suivant utilise directement MonAdaptateurAuth :

<?php
// Définition de l'adaptateur d'authentification
$authAdaptateur = new MonAdaptateurAuth($identifiant, $motdepasse);

// Tentative d'authentification, stockage du résultat
$resultat = $authAdaptateur->authenticate();

if (!$resultat->isValid()) {
    // échec de l'authentification ; afficher pourquoi
    foreach ($resultat->getMessages() as $message) {
        echo "$message\n";
    }
} else {
    // Authentification réussie
    // $resultat->getIdentity() === $identifiant
}
    		

Welcome!

Welcome to ZFResource - The Resource for the Zend Framework.
As you see, the website is in still in progress. Many features ( like Code Directory, Code Samples, User written Tutorials, Examples and News,...) will be online in near future.
At the moment, you can search and browse the manual in your language of choice. Don't forget to come back later to benefit from the new features.


Help Wanted:

We are still searching for people want to help building this site. If you want to see this website in your language or you have any suggestions for this site please send us an email