<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24604 -->
<!-- Reviewed: no -->
<sect1 id="learning.multiuser.authentication">
    <title>Authentification d'utilisateurs dans Zend Framework</title>

    <sect2 id="learning.multiuser.authentication.intro">
        <title>Introduction à l'authentification</title>

        <para>
            Une fois que l'application a récupéré les informations d'un utilisateur, elle doit
            vérifier leur "authenticité", c'est l'authentification. Pour celà, deux informations
            sont nécessaires : l'identifiant et un ensemble de règles régissant cet identifiant,
            aujourd'hui typiquement une chaine de caractères servant de mot de passe est très
            classique, mais d'autres procédés existent (reconnaissances digitales, occulaires...)
        </para>

        <para>
            Un identifiant peut lui aussi être un "login" tout banal, mais pourquoi pas un
            numéro de membre, une adresse email... le secret, lui, est donc souvent un mot de passe
            sous forme de chaine de caractères.
        </para>

    </sect2>

    <sect2 id="learning.multiuser.authentication.basic-usage">
        <title>Utilisation de base de Zend_Auth</title>

        <para>
            Dans l'exemple suivant, nous utiliserons <classname>Zend_Auth</classname> afin d'effectuer
            une authentification des plus classiques: champ login et password puis vérification en
            base de données. Cet exemple suppose que vous utilisez
            <classname>Zend_Application</classname> afin de configurer une connexion à une base de
            données.
        </para>

        <para>
            <classname>Zend_Auth</classname> effectue deux tâches. D'abord elle doit récupérer un
            adaptateur d'authentification afin de déclencher le processus d'authentification, puis
            si celui-ci est correct, elle doit faire persister ces informations entre requêtes.
            Pour assurer cette persistance, <classname>Zend_Auth</classname> utilise un
            <classname>Zend_Session_Namespace</classname>, mais en général vous n'aurez pas besoin
            d'agir sur cet objet.
        </para>

        <para>
            Supposant une table de base de données suivante:
        </para>

        <programlisting language="php"><![CDATA[
CREATE TABLE users (
    id INTEGER  NOT NULL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(32) NULL,
    password_salt VARCHAR(32) NULL,
    real_name VARCHAR(150) NULL
)
]]></programlisting>

        <para>
            C'est une table qui inclue des champs nom, password et aussi grain de sel. Le grain de
            sel est utilisé pour améliorer la sécurité contre les attaques par force brute qui
            cibleraient l'alogithme de hashage du mot de passe. <ulink
                url="http://en.wikipedia.org/wiki/Salting_%28cryptography%29">Plus
                d'informations</ulink> sur le grain de sel.
        </para>

        <para>
            Créons un formulaire de login simple. Nous utiliserons <classname>Zend_Form</classname>.
        </para>

        <programlisting language="php"><![CDATA[
// localisé à application/forms/Auth/Login.php

class Default_Form_Auth_Login extends Zend_Form
{
    public function init()
    {
        $this->setMethod('post');

        $this->addElement(
            'text', 'username', array(
                'label' => 'Username:',
                'required' => true,
                'filters'    => array('StringTrim'),
            ));

        $this->addElement('password', 'password', array(
            'label' => 'Password:',
            'required' => true,
            ));

        $this->addElement('submit', 'submit', array(
            'ignore'   => true,
            'label'    => 'Login',
            ));

    }
}
]]></programlisting>

        <para>
            Ce formulaire nous mène vers la création du contrôleur de traitement. Nous l'appellerons
            "<classname>AuthController</classname>", et le logerons dans
            <filename>application/controllers/AuthController.php</filename>. Il possèdera une seule méthode
            "<methodname>loginAction()</methodname>" vers laquelle le formulaire enverra, la méthode
            va donc réagir à GET et à POST, elle encapsule toute la logique.
        </para>

        <para>
            Le code suivant montre comment construire l'adaptateur d'authentification et l'intégration du
            formulaire:
        </para>

        <programlisting language="php"><![CDATA[
class AuthController extends Zend_Controller_Action
{

    public function loginAction()
    {
        $db = $this->_getParam('db');

        $loginForm = new Default_Form_Auth_Login();

        if ($loginForm->isValid($_POST)) {

            $adapter = new Zend_Auth_Adapter_DbTable(
                $db,
                'users',
                'username',
                'password',
                'MD5(CONCAT(?, password_salt))'
                );

            $adapter->setIdentity($loginForm->getValue('username'));
            $adapter->setCredential($loginForm->getValue('password'));

            $auth   = Zend_Auth::getInstance();
            $result = $auth->authenticate($adapter);

            if ($result->isValid()) {
                $this->_helper->FlashMessenger('Successful Login');
                $this->_redirect('/');
                return;
            }

        }

        $this->view->loginForm = $loginForm;

    }

}
]]></programlisting>

        <para>
            Le script de vue est quant à lui enfantin, il sera logé dans
            <filename>application/views/scripts/auth/login.phtml</filename>:
        </para>

        <programlisting language="php"><![CDATA[
$this->form->setAction($this->url());
echo $this->form;
]]></programlisting>

        <para>
            Et voila! Avec ce scénario de base, vous pouvez étendre les possibilités et répondre
            à vos besoins précis. Tous les adaptateurs
            <classname>Zend_Auth</classname> se trouvent décrits dans
            <link linkend="zend.auth">le guide de réference</link>.
        </para>
    </sect2>
</sect1>

