Zend_Auth.xml 19 KB

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