multiuser-authentication.xml 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24604 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.multiuser.authentication">
  5. <title>Authentification d'utilisateurs dans Zend Framework</title>
  6. <sect2 id="learning.multiuser.authentication.intro">
  7. <title>Introduction à l'authentification</title>
  8. <para>
  9. Une fois que l'application a récupéré les informations d'un utilisateur, elle doit
  10. vérifier leur "authenticité", c'est l'authentification. Pour celà, deux informations
  11. sont nécessaires : l'identifiant et un ensemble de règles régissant cet identifiant,
  12. aujourd'hui typiquement une chaine de caractères servant de mot de passe est très
  13. classique, mais d'autres procédés existent (reconnaissances digitales, occulaires...)
  14. </para>
  15. <para>
  16. Un identifiant peut lui aussi être un "login" tout banal, mais pourquoi pas un
  17. numéro de membre, une adresse email... le secret, lui, est donc souvent un mot de passe
  18. sous forme de chaine de caractères.
  19. </para>
  20. </sect2>
  21. <sect2 id="learning.multiuser.authentication.basic-usage">
  22. <title>Utilisation de base de Zend_Auth</title>
  23. <para>
  24. Dans l'exemple suivant, nous utiliserons <classname>Zend_Auth</classname> afin d'effectuer
  25. une authentification des plus classiques: champ login et password puis vérification en
  26. base de données. Cet exemple suppose que vous utilisez
  27. <classname>Zend_Application</classname> afin de configurer une connexion à une base de
  28. données.
  29. </para>
  30. <para>
  31. <classname>Zend_Auth</classname> effectue deux tâches. D'abord elle doit récupérer un
  32. adaptateur d'authentification afin de déclencher le processus d'authentification, puis
  33. si celui-ci est correct, elle doit faire persister ces informations entre requêtes.
  34. Pour assurer cette persistance, <classname>Zend_Auth</classname> utilise un
  35. <classname>Zend_Session_Namespace</classname>, mais en général vous n'aurez pas besoin
  36. d'agir sur cet objet.
  37. </para>
  38. <para>
  39. Supposant une table de base de données suivante:
  40. </para>
  41. <programlisting language="php"><![CDATA[
  42. CREATE TABLE users (
  43. id INTEGER NOT NULL PRIMARY KEY,
  44. username VARCHAR(50) UNIQUE NOT NULL,
  45. password VARCHAR(32) NULL,
  46. password_salt VARCHAR(32) NULL,
  47. real_name VARCHAR(150) NULL
  48. )
  49. ]]></programlisting>
  50. <para>
  51. C'est une table qui inclue des champs nom, password et aussi grain de sel. Le grain de
  52. sel est utilisé pour améliorer la sécurité contre les attaques par force brute qui
  53. cibleraient l'alogithme de hashage du mot de passe. <ulink
  54. url="http://en.wikipedia.org/wiki/Salting_%28cryptography%29">Plus
  55. d'informations</ulink> sur le grain de sel.
  56. </para>
  57. <para>
  58. Créons un formulaire de login simple. Nous utiliserons <classname>Zend_Form</classname>.
  59. </para>
  60. <programlisting language="php"><![CDATA[
  61. // localisé à application/forms/Auth/Login.php
  62. class Default_Form_Auth_Login extends Zend_Form
  63. {
  64. public function init()
  65. {
  66. $this->setMethod('post');
  67. $this->addElement(
  68. 'text', 'username', array(
  69. 'label' => 'Username:',
  70. 'required' => true,
  71. 'filters' => array('StringTrim'),
  72. ));
  73. $this->addElement('password', 'password', array(
  74. 'label' => 'Password:',
  75. 'required' => true,
  76. ));
  77. $this->addElement('submit', 'submit', array(
  78. 'ignore' => true,
  79. 'label' => 'Login',
  80. ));
  81. }
  82. }
  83. ]]></programlisting>
  84. <para>
  85. Ce formulaire nous mène vers la création du contrôleur de traitement. Nous l'appellerons
  86. "<classname>AuthController</classname>", et le logerons dans
  87. <filename>application/controllers/AuthController.php</filename>. Il possèdera une seule méthode
  88. "<methodname>loginAction()</methodname>" vers laquelle le formulaire enverra, la méthode
  89. va donc réagir à GET et à POST, elle encapsule toute la logique.
  90. </para>
  91. <para>
  92. Le code suivant montre comment construire l'adaptateur d'authentification et l'intégration du
  93. formulaire:
  94. </para>
  95. <programlisting language="php"><![CDATA[
  96. class AuthController extends Zend_Controller_Action
  97. {
  98. public function loginAction()
  99. {
  100. $db = $this->_getParam('db');
  101. $loginForm = new Default_Form_Auth_Login();
  102. if ($loginForm->isValid($_POST)) {
  103. $adapter = new Zend_Auth_Adapter_DbTable(
  104. $db,
  105. 'users',
  106. 'username',
  107. 'password',
  108. 'MD5(CONCAT(?, password_salt))'
  109. );
  110. $adapter->setIdentity($loginForm->getValue('username'));
  111. $adapter->setCredential($loginForm->getValue('password'));
  112. $auth = Zend_Auth::getInstance();
  113. $result = $auth->authenticate($adapter);
  114. if ($result->isValid()) {
  115. $this->_helper->FlashMessenger('Successful Login');
  116. $this->_redirect('/');
  117. return;
  118. }
  119. }
  120. $this->view->loginForm = $loginForm;
  121. }
  122. }
  123. ]]></programlisting>
  124. <para>
  125. Le script de vue est quant à lui enfantin, il sera logé dans
  126. <filename>application/views/scripts/auth/login.phtml</filename>:
  127. </para>
  128. <programlisting language="php"><![CDATA[
  129. $this->form->setAction($this->url());
  130. echo $this->form;
  131. ]]></programlisting>
  132. <para>
  133. Et voila! Avec ce scénario de base, vous pouvez étendre les possibilités et répondre
  134. à vos besoins précis. Tous les adaptateurs
  135. <classname>Zend_Auth</classname> se trouvent décrits dans
  136. <link linkend="zend.auth">le guide de réference</link>.
  137. </para>
  138. </sect2>
  139. </sect1>