| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- <?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>
|