Zend_Auth.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 15617 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.auth.introduction">
  5. <title>Introduction</title>
  6. <para>
  7. <classname>Zend_Auth</classname> fournit une API pour l'authentification et inclut
  8. des adaptateurs concrets d'authentification pour les cas les plus courants.
  9. </para>
  10. <para>
  11. <classname>Zend_Auth</classname> est uniquement concerné par
  12. <emphasis>le processus d'authentification</emphasis> et non pas par
  13. <emphasis>le processus d'autorisation</emphasis>. L'authentification est définie de
  14. manière lâche (souple) afin de déterminer si une entité donnée est bien celle qu'elle
  15. prétend être (c.-à-d. identification), sur la base d'identifiants fournis. L'autorisation,
  16. l'action de décider si une entité donnée peut accéder à d'autres entités et/ou exécuter des
  17. opérations sur celles-ci ne fait pas partie des prérogatives de
  18. <classname>Zend_Auth</classname>. Pour plus d'informations sur les autorisations et le
  19. contrôle d'accès via Zend Framework, voyez
  20. <link linkend="zend.acl"><classname>Zend_Acl</classname></link>.
  21. </para>
  22. <note>
  23. <para>
  24. La classe <classname>Zend_Auth</classname> inclut un singleton - uniquement une
  25. instance de la classe est disponible - à travers la méthode statique
  26. <code>getInstance()</code>. Celle ci utilise un opérateur <code>new</code> et le
  27. mot-clé <code>clone</code> ne fonctionnera pas avec la classe
  28. <classname>Zend_Auth</classname>, utilisez <code>getInstance()</code> à la
  29. place.
  30. </para>
  31. </note>
  32. <sect2 id="zend.auth.introduction.adapters">
  33. <title>Adaptateurs</title>
  34. <para>
  35. Un adaptateur <classname>Zend_Auth</classname> est utilisé pour authentifier via
  36. un service particulier d'authentification, comme LDAP, RDBMS ou un stockage basé sur
  37. des fichiers. Les différents adaptateurs peuvent posséder des options et des
  38. comportements très divers. Cependant, quelques méthodes de base leur sont communes. Par
  39. exemple, accepter des éléments d'authentification (incluant une identité prétendue),
  40. authentifier et retourner un résultat sont des éléments communs aux adaptateurs
  41. <classname>Zend_Auth</classname>.
  42. </para>
  43. <para>
  44. Chaque classe d'adaptateur <classname>Zend_Auth</classname> implémente
  45. <classname>Zend_Auth_Adapter_Interface</classname>. Cette interface définit une
  46. méthode, <code>authenticate</code>, celle-ci est implémentée par une classe adaptateur
  47. à fin de réaliser l'authentification. Chaque classe adaptateur doit être préparée avant
  48. tout appel de <code>authenticate()</code>. Cela implique que chaque adaptateur
  49. fournisse la possibilité de définir des éléments d'authentification (par exemple
  50. identifiant et mot de passe) et de définir des valeurs pour les options spécifiques de
  51. l'adaptateur, tels que les paramètres de connexion à une base de données pour un
  52. adaptateur qui en fait usage.
  53. </para>
  54. <para>
  55. L'exemple suivant est un adaptateur d'authentification qui requiert un
  56. identifiant et un mot de passe. D'autres détails, tel que la manière d'interroger le
  57. service d'authentification, ont été omis par souci de clarté&#160;:
  58. <programlisting language="php"><![CDATA[
  59. class MonAdaptateurAuth implements Zend_Auth_Adapter_Interface
  60. {
  61. /**
  62. * Définition de l'identifiant et du mot de passe
  63. * pour authentification
  64. *
  65. * @return void
  66. */
  67. public function __construct($identifiant, $motdepasse)
  68. {
  69. // ...
  70. }
  71. /**
  72. * Réalise une tentative d'authentification
  73. *
  74. * @throws Zend_Auth_Adapter_Exception Si l'authentification
  75. * ne peut pas être réalisée
  76. * @return Zend_Auth_Result
  77. */
  78. public function authenticate()
  79. {
  80. // ...
  81. }
  82. }
  83. ]]></programlisting>
  84. Comme indiqué dans la documentation "docblock", <code>authenticate()</code> doit
  85. retourner une instance de <classname>Zend_Auth_Result</classname> (ou d'une classe
  86. dérivée de <classname>Zend_Auth_Result</classname>). Si pour quelque raison que ce
  87. soit, la requête d'authentification ne peut pas être réalisée,
  88. <code>authenticate()</code> retournera une exception dérivée de
  89. <classname>Zend_Auth_Adapter_Exception</classname>.
  90. </para>
  91. </sect2>
  92. <sect2 id="zend.auth.introduction.results">
  93. <title>Résultats</title>
  94. <para>
  95. Les adaptateurs <classname>Zend_Auth</classname> retournent une instance de
  96. <classname>Zend_Auth_Result</classname> via <code>authenticate()</code> de manière à
  97. présenter les résultats d'une tentative d'authentification. Les adaptateurs alimentent
  98. l'objet <classname>Zend_Auth_Result</classname> lors de sa construction, de manière à
  99. ce que les quatre méthodes suivantes fournissent de base un lot d'opérations communes
  100. aux résultats des adaptateurs <classname>Zend_Auth</classname>&#160;:
  101. <itemizedlist>
  102. <listitem>
  103. <para>
  104. <code>isValid()</code>&#160;: retourne <code>true</code> si et seulement
  105. si le résultat représente une tentative réussie d'authentification
  106. </para>
  107. </listitem>
  108. <listitem>
  109. <para>
  110. <code>getCode()</code>&#160;: retourne une constante
  111. <classname>Zend_Auth_Result</classname> qui détermine le type de retour
  112. accepté ou refusé (NDT : voir tableau ci dessous). Cela peut être utilisé
  113. pour les développeurs voulant distinguer en amont les différents types de
  114. résultat. Il est possible d'avoir des statistiques détaillées, par exemple.
  115. Une autre utilisation est la personnalisation du message de retour au
  116. client. Attention cependant à ne pas trop donner de détails aux clients
  117. pour des raisons de sécurité. Pour plus de détails, consultez les notes
  118. ci-dessous.
  119. </para>
  120. </listitem>
  121. <listitem>
  122. <para>
  123. <code>getIdentity()</code>&#160;: retourne l'identité de la tentative
  124. d'authentification.
  125. </para>
  126. </listitem>
  127. <listitem>
  128. <para>
  129. <code>getMessages()</code>&#160;: retourne un tableau de messages relatifs
  130. à une tentative infructueuse d'authentification.
  131. </para>
  132. </listitem>
  133. </itemizedlist>
  134. </para>
  135. <para>
  136. Un développeur peut connecter le résultat de l'authentification avec des
  137. opérations spécifiques. Certaines opérations développées peuvent bloquer le compte
  138. après plusieurs refus du mot de passe, bannir une adresse IP après plusieurs essais sur
  139. des comptes inexistants ou fournir un message spécifique à l'utilisateur final. Les
  140. codes suivants sont disponibles&#160;:
  141. <programlisting language="php"><![CDATA[
  142. Zend_Auth_Result::SUCCESS
  143. Zend_Auth_Result::FAILURE
  144. Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
  145. Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
  146. Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
  147. Zend_Auth_Result::FAILURE_UNCATEGORIZED
  148. ]]></programlisting>
  149. </para>
  150. <para>
  151. L'exemple suivant illustre comment utiliser le retour&#160;:
  152. <programlisting language="php"><![CDATA[
  153. // A l'intérieur de la méthode AuthController / loginAction
  154. $resultat = $this->_auth->authenticate($adapter);
  155. switch ($resultat->getCode()) {
  156. case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
  157. /** l'identifiant n'existe pas **/
  158. break;
  159. case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
  160. /** mauvaise authentification **/
  161. break;
  162. case Zend_Auth_Result::SUCCESS:
  163. /** authentification acceptée **/
  164. break;
  165. default:
  166. /** autres cas **/
  167. break;
  168. }
  169. ]]></programlisting>
  170. </para>
  171. </sect2>
  172. <sect2 id="zend.auth.introduction.persistence">
  173. <title>Persistance d'identité</title>
  174. <para>
  175. Authentifier une requête qui contient des paramètres d'authentification est utile
  176. en soi, mais il est également important de permettre le maintien de l'identité
  177. authentifiée sans avoir à représenter ces paramètres d'authentification à chaque
  178. requête.
  179. </para>
  180. <para>
  181. HTTP est un protocole sans état, cependant, des techniques telles que les cookies
  182. ou les sessions ont été développées de manière à faciliter le maintien d'un contexte
  183. lors de multiples requêtes dans les applications Web.
  184. </para>
  185. <sect3 id="zend.auth.introduction.persistence.default">
  186. <title>Persistance par défaut dans une session PHP</title>
  187. <para>
  188. <link linkend="zend.session"><classname>Zend_Session</classname></link>est utilisé
  189. par <classname>Zend_Auth</classname> pour fournir un stockage persistant de
  190. l'identité, après une authentification réussie, via les sessions PHP. Après une
  191. authentification réussie, <classname>Zend_Auth::authenticate()</classname> conserve
  192. l'identité résultant de l'authentification dans un stockage persistant. Par défaut,
  193. <classname>Zend_Auth</classname> utilise une classe de stockage basée sur
  194. <link linkend="zend.session">Zend_Session</link>. La classe de stockage peut être
  195. changée en fournissant un objet de stockage différent à
  196. <classname>Zend_Auth::setStorage()</classname>. Une classe personnalisée peut
  197. fournir une implémentation de l'objet
  198. <classname>Zend_Auth_Storage_Interface</classname> à
  199. <classname>Zend_Auth::setStorage()</classname>.
  200. </para>
  201. <note>
  202. <para>
  203. Si la persistance automatique de l'identité n'est pas souhaitable dans un
  204. cas particulier, alors le développeur peut renoncer à utiliser la classe
  205. <classname>Zend_Auth</classname> et préférer utiliser directement une classe
  206. adaptateur.
  207. </para>
  208. </note>
  209. <example id="zend.auth.introduction.persistence.default.example">
  210. <title>Changer l'espace de nommage de la session</title>
  211. <para>
  212. <classname>Zend_Auth_Storage_Session</classname> utilise un espace de
  213. nommage de <code>"Zend_Auth"</code>. Cet espace peut être écrit en passant les
  214. valeurs au constructeur de <classname>Zend_Auth_Storage_Session</classname>, et
  215. ces valeurs sont passées en interne au constructeur de
  216. <classname>Zend_Session_Namespace</classname>. Cela doit être fait avant
  217. l'authentification, et avant que
  218. <classname>Zend_Auth::authenticate()</classname> ait accompli le stockage
  219. automatique de l'identité.
  220. <programlisting language="php"><![CDATA[
  221. // Sauver une référence du singleton, instance de Zend_Auth
  222. $auth = Zend_Auth::getInstance();
  223. // Utiliser 'unEspaceDeNommage' instance de 'Zend_Auth'
  224. $auth->setStorage(new Zend_Auth_Storage_Session('unEspaceDeNommage'));
  225. /**
  226. * @todo Paramètrage de l'adaptateur d'authentification :
  227. * $authAdaptateur
  228. */
  229. // authentification, sauvegarde du résultat
  230. // et stockage du résultat en cas de succès
  231. $resultat = $auth->authenticate($authAdaptateur);
  232. ]]></programlisting>
  233. </para>
  234. </example>
  235. </sect3>
  236. <sect3 id="zend.auth.introduction.persistence.custom">
  237. <title>Installer un stockage personnalisé</title>
  238. <para>
  239. Parfois les développeurs ont besoin d'utiliser un comportement de persistance
  240. d'identité différent de celui fourni par
  241. <classname>Zend_Auth_Storage_Session</classname>. Dans ces cas, les développeurs
  242. implémentent simplement <classname>Zend_Auth_Storage_Interface</classname> et
  243. fournissent t une instance de la classe à
  244. <classname>Zend_Auth::setStorage()</classname>.
  245. </para>
  246. <example id="zend.auth.introduction.persistence.custom.example">
  247. <title>Utiliser une classe de stockage personnalisée</title>
  248. <para>
  249. Pour utiliser une classe de stockage d'identité persistante autre que
  250. <classname>Zend_Auth_Storage_Session</classname>, le développeur commence par
  251. implémenter <classname>Zend_Auth_Storage_Interface</classname>&#160;:
  252. <programlisting language="php"><![CDATA[
  253. class MonStockage implements Zend_Auth_Storage_Interface
  254. {
  255. /**
  256. * Retourne true si et seulement si le stockage est vide
  257. *
  258. * @throws Zend_Auth_Storage_Exception S'il est impossible de déterminer
  259. * si le stockage est vide
  260. * @return boolean
  261. */
  262. public function isEmpty()
  263. {
  264. /**
  265. * @todo implémentation
  266. */
  267. }
  268. /**
  269. * Retourne le contenu du stockage
  270. *
  271. * Comportement à définir si le stockage est vide.
  272. *
  273. * @throws Zend_Auth_Storage_Exception Si la lecture du stockage
  274. * est impossible
  275. * @return mixed
  276. */
  277. public function read()
  278. {
  279. /**
  280. * @todo implémentation
  281. */
  282. }
  283. /**
  284. * Ecrit $contents dans le stockage
  285. *
  286. * @param mixed $contents
  287. * @throws Zend_Auth_Storage_Exception Si l'écriture de $contents
  288. * est impossible
  289. * @return void
  290. */
  291. public function write($contents)
  292. {
  293. /**
  294. * @todo implementation
  295. */
  296. }
  297. /**
  298. * RAZ du stockage
  299. *
  300. * @throws Zend_Auth_Storage_Exception Si la remise à zéro (RAZ)
  301. * est impossible
  302. * @return void
  303. */
  304. public function clear()
  305. {
  306. /**
  307. * @todo implementation
  308. */
  309. }
  310. }
  311. ]]></programlisting>
  312. </para>
  313. <para>
  314. Ensuite la classe personnalisée est invoquée, avant la requête
  315. d'authentification, avec <classname>Zend_Auth::setStorage()</classname>&#160;:
  316. <programlisting language="php"><![CDATA[
  317. // Définit la classe personnalisée à utiliser
  318. Zend_Auth::getInstance()->setStorage(new MonStockage());
  319. /**
  320. * @todo Paramètrage de l'adaptateur d'authentification :
  321. * $authAdaptateur
  322. */
  323. // Authentification, sauvegarde et
  324. // persistance du résultat en cas de succès.
  325. $result = Zend_Auth::getInstance()->authenticate($authAdaptateur);
  326. ]]></programlisting>
  327. </para>
  328. </example>
  329. </sect3>
  330. </sect2>
  331. <sect2 id="zend.auth.introduction.using">
  332. <title>Utilisation de Zend_Auth</title>
  333. <para>
  334. Deux manières d'utiliser les adaptateurs <classname>Zend_Auth</classname> sont
  335. proposées&#160;:
  336. <orderedlist>
  337. <listitem>
  338. <para>
  339. indirectement, via <classname>Zend_Auth::authenticate()</classname>&#160;;
  340. </para>
  341. </listitem>
  342. <listitem>
  343. <para>
  344. directement, via la méthode <code>authenticate()</code> de
  345. l'adaptateur.
  346. </para>
  347. </listitem>
  348. </orderedlist>
  349. </para>
  350. <para>
  351. L'exemple suivant illustre la manière d'utiliser un adaptateur
  352. <classname>Zend_Auth</classname> de manière indirecte via l'utilisation de la classe
  353. <classname>Zend_Auth</classname>&#160;:
  354. <programlisting language="php"><![CDATA[
  355. // Obtention d'une référence de l'instance du Singleton de Zend_Auth
  356. $auth = Zend_Auth::getInstance();
  357. // Définition de l'adaptateur d'authentification
  358. $authAdaptateur = new MonAdaptateurAuth($identifiant, $motdepasse);
  359. // Tentative d'authentification et stockage du résultat
  360. $resultat = $auth->authenticate($authAdaptateur);
  361. if (!$resultat->isValid()) {
  362. // Echec de l'authentification ; afficher pourquoi
  363. foreach ($resultat->getMessages() as $message) {
  364. echo "$message\n";
  365. }
  366. } else {
  367. // Authentification réussie ; l'identité ($identifiant) est
  368. // stockée dans la session
  369. // $resultat->getIdentity() === $auth->getIdentity()
  370. // $resultat->getIdentity() === $identifiant
  371. }
  372. ]]></programlisting>
  373. </para>
  374. <para>
  375. Une fois la tentative d'authentification réalisée, tel que montré ci-dessus, il
  376. est très simple de vérifier si une identité correctement authentifiée existe&#160;:
  377. <programlisting language="php"><![CDATA[
  378. $auth = Zend_Auth::getInstance();
  379. if ($auth->hasIdentity()) {
  380. // l'identité existe ; on la récupère
  381. $identite = $auth->getIdentity();
  382. }
  383. ]]></programlisting>
  384. </para>
  385. <para>
  386. Pour retirer une identité du stockage persistant, utilisez simplement la méthode
  387. <code>clearIdentity()</code>. A utiliser typiquement pour implémenter une opération de
  388. déconnexion d'une application&#160;:
  389. <programlisting language="php"><![CDATA[
  390. Zend_Auth::getInstance()->clearIdentity();
  391. ]]></programlisting>
  392. </para>
  393. <para>
  394. Quand l'utilisation automatique du stockage persistant n'est pas appropriée, le
  395. développeur peut simplement contourner l'utilisation de la classe
  396. <classname>Zend_Auth</classname> en utilisant directement une classe adaptateur.
  397. L'usage direct d'une classe adaptateur implique de configurer et préparer l'objet
  398. adaptateur et d'appeler ensuite sa méthode <code>authenticate()</code>. Les détails
  399. spécifiques à un adaptateur sont décrits dans la documentation de chacun d'entre-eux.
  400. L'exemple suivant utilise directement <classname>MonAdaptateurAuth</classname>&#160;:
  401. <programlisting language="php"><![CDATA[
  402. // Définition de l'adaptateur d'authentification
  403. $authAdaptateur = new MonAdaptateurAuth($identifiant, $motdepasse);
  404. // Tentative d'authentification, stockage du résultat
  405. $resultat = $authAdaptateur->authenticate();
  406. if (!$resultat->isValid()) {
  407. // échec de l'authentification ; afficher pourquoi
  408. foreach ($resultat->getMessages() as $message) {
  409. echo "$message\n";
  410. }
  411. } else {
  412. // Authentification réussie
  413. // $resultat->getIdentity() === $identifiant
  414. }
  415. ]]></programlisting>
  416. </para>
  417. </sect2>
  418. </sect1>