Zend_Acl.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.acl.introduction">
  5. <title>Introduction</title>
  6. <para>
  7. <classname>Zend_Acl</classname> fournit une implémentation légère et flexible de
  8. listes de contrôle d'accès (<acronym>ACL</acronym>) pour la gestion de privilèges. En
  9. général, une application peut utiliser ces <acronym>ACL</acronym> pour contrôler l'accès à
  10. certains objets par d'autres objets demandeurs.
  11. </para>
  12. <para>
  13. Dans le cadre de cette documentation&#160;:
  14. </para>
  15. <itemizedlist>
  16. <listitem>
  17. <para>
  18. une <emphasis>ressource</emphasis> est un objet dont l'accès est contrôlé,
  19. </para>
  20. </listitem>
  21. <listitem>
  22. <para>
  23. un <emphasis>rôle</emphasis> est un objet qui peut demander l'accès à une ressource.
  24. </para>
  25. </listitem>
  26. </itemizedlist>
  27. <para>
  28. Dit simplement, <emphasis> les rôles demandent l'accès à des
  29. ressources</emphasis>. Par exemple, si une personne demande l'accès à une voiture, alors la
  30. personne est le rôle demandeur et la voiture est la ressource, puisque l'accès à la voiture
  31. est soumis à un contrôle.
  32. </para>
  33. <para>
  34. Grâce à la définition et à la mise en oeuvre d'une <acronym>ACL</acronym>,
  35. une application peut contrôler comment les objets demandeurs (rôles) reçoivent l'accès (ou
  36. non) à des objets protégés (ressources).
  37. </para>
  38. <sect2 id="zend.acl.introduction.resources">
  39. <title>A propos des ressources</title>
  40. <para>
  41. Avec <classname>Zend_Acl</classname>, créer une ressource est très simple.
  42. <classname>Zend_Acl</classname> fournit
  43. <classname>Zend_Acl_Resource_Interface</classname> pour faciliter la tâche aux
  44. développeurs. Une classe a simplement besoin d'implémenter cette interface, qui
  45. consiste en une seule méthode, <methodname>getResourceId()</methodname>, pour que
  46. <classname>Zend_Acl</classname> reconnaît l'objet comme étant une ressource. Par
  47. ailleurs, <classname>Zend_Acl_Resource</classname> est fourni par
  48. <classname>Zend_Acl</classname> comme une implémentation basique de ressource que les
  49. développeurs peuvent étendre si besoin.
  50. </para>
  51. <para>
  52. <classname>Zend_Acl</classname> fournit une structure en arbre à laquelle
  53. plusieurs ressources (ou "zone sous contrôle d'accès") peuvent être ajoutées. Puisque
  54. les ressources sont sauvées dans cet arbre, elles peuvent être organisées du général
  55. (via la racine de l'arbre) jusqu'au particulier (via les feuilles de l'arbre). Les
  56. requêtes envers une ressource spécifique vont automatiquement entraîner la recherche de
  57. règles sur ses parents au sein de la structure hiérarchique des ressources, ce qui
  58. permet un héritage simple des règles. Par exemple, si une règle par défaut doit être
  59. appliquée à tous les bâtiments d'une ville, on pourra simplement assigner la règle à la
  60. ville elle-même, au lieu de la répéter à tous les bâtiments. Mais certains bâtiments
  61. peuvent nécessiter des règles spécifiques, et ceci peut se faire aisément avec
  62. <classname>Zend_Acl</classname> en assignant les règles nécessaires à chaque bâtiment
  63. de la ville qui nécessite une exception. Une ressource peut hériter d'un seul parent
  64. ressource, qui hérite lui même de son propre parent, et ainsi de suite.
  65. </para>
  66. <para>
  67. <classname>Zend_Acl</classname> supporte aussi des privilèges pour chaque
  68. ressource (par exemple : "créer", "lire", "modifier", "supprimer"), et le développeur
  69. peut assigner des règles qui affectent tous les privilèges ou seuls certains privilèges
  70. d'une ressource.
  71. </para>
  72. </sect2>
  73. <sect2 id="zend.acl.introduction.roles">
  74. <title>A propos des rôles</title>
  75. <para>
  76. Comme pour les ressources, créer un rôle est très simple. Tout rôle doit implémenter
  77. <classname>Zend_Acl_Role_Interface</classname> qui consiste en une seule méthode
  78. <methodname>getRoleId()</methodname>. De plus, <classname>Zend_Acl_Role</classname> est
  79. inclus dans <classname>Zend_Acl</classname> comme une implémentation basique de rôle que
  80. les développeurs peuvent étendre si besoin.
  81. </para>
  82. <para>
  83. Dans <classname>Zend_Acl</classname>, un rôle peut hériter de un ou plusieurs
  84. rôles. Ceci permet de supporter l'héritage de règles à travers plusieurs rôles. Par
  85. exemple, un rôle utilisateur, comme "Éric", peut appartenir à un ou plusieurs rôles
  86. d'action, tels que "éditeur" ou "administrateur". Le développeur peut créer des règles
  87. pour "éditeur" et "administrateur" séparément, et "Éric" va hériter des règles des deux
  88. sans avoir à définir des règles directement pour "Éric".
  89. </para>
  90. <para>
  91. Bien que la possibilité d'hériter de plusieurs rôles soit très utile, l'héritage
  92. multiple introduit aussi un certain degré de complexité. L'exemple ci-dessous illustre
  93. l'ambiguïté et la manière dont <classname>Zend_Acl</classname> la résout.
  94. </para>
  95. <example id="zend.acl.introduction.roles.example.multiple_inheritance">
  96. <title>Héritages multiples entre rôles</title>
  97. <para>
  98. Le code ci-dessous définit trois rôles de base - "guest", "member", et "admin" -
  99. desquels d'autres rôles peuvent hériter. Ensuite, un rôle identifié par "someUser"
  100. est créé et hérite des trois autres rôles. L'ordre selon lequel ces rôles
  101. apparaissent dans le tableau <varname>$parents</varname> est important. Lorsque cela
  102. est nécessaire <classname>Zend_Acl</classname> recherche les règles d'accès définies
  103. non seulement pour le rôle demandé (ici "someUser"), mais aussi pour les autres
  104. rôles desquels le rôle recherché hérite (ici "guest", "member", et "admin")&#160;:
  105. </para>
  106. <programlisting language="php"><![CDATA[
  107. $acl = new Zend_Acl();
  108. $acl->addRole(new Zend_Acl_Role('guest'))
  109. ->addRole(new Zend_Acl_Role('member'))
  110. ->addRole(new Zend_Acl_Role('admin'));
  111. $parents = array('guest', 'member', 'admin');
  112. $acl->addRole(new Zend_Acl_Role('someUser'), $parents);
  113. $acl->add(new Zend_Acl_Resource('someResource'));
  114. $acl->deny('invite', 'someResource');
  115. $acl->allow('membre', 'someResource');
  116. echo $acl->isAllowed('someUser', 'someResource') ? 'autorisé' : 'refusé';
  117. ]]></programlisting>
  118. <para>
  119. Puisqu'il n'y a pas de règle spécifiquement définie pour le rôle
  120. "someUser" et "someResource", <classname>Zend_Acl</classname> doit rechercher
  121. des règles qui pourraient être définies pour des rôles dont "someUser" hérite.
  122. Premièrement, le rôle "admin" est contrôlé, et il n'y a pas de règle d'accès
  123. définie pour lui. Ensuite, le rôle "member" est visité, et
  124. <classname>Zend_Acl</classname> trouve qu'il y a une règle qui spécifie que
  125. "member" a un accès autorisé à "someResource".
  126. </para>
  127. <para>
  128. Si <classname>Zend_Acl</classname> continuait à examiner toutes les règles de
  129. tous les rôles parents, il trouverait que "someResource" est interdit d'accès à
  130. "someResource". Ceci introduit une ambiguïté puisque maintenant "someUser" est
  131. à la fois autorisé et interdit d'accès à "someResource", puisqu'il hérite de règles
  132. opposées de ses différents parents.
  133. </para>
  134. <para>
  135. <classname>Zend_Acl</classname> résout cette ambiguïté en arrêtant la
  136. recherche de règles d'accès dès qu'une première règle est découverte. Dans notre
  137. exemple, puisque le rôle "member" est examiné avant le rôle "guest", le résultat
  138. devrait afficher "autorisé".
  139. </para>
  140. </example>
  141. <note>
  142. <para>
  143. Lorsque vous spécifiez plusieurs parents pour un rôle, conservez à l'esprit
  144. que le dernier parent listé est le premier dans lequel une règle utilisable sera
  145. recherchée.
  146. </para>
  147. </note>
  148. </sect2>
  149. <sect2 id="zend.acl.introduction.creating">
  150. <title>Créer la Liste de Contrôle d'Accès</title>
  151. <para>
  152. Une <acronym>ACL</acronym> peut représenter n'importe quel ensemble d'objets physiques
  153. ou virtuels que vous souhaitez. Pour les besoins de la démonstration, nous allons créer
  154. un système basique d'<acronym>ACL</acronym> pour une Gestion de Contenus
  155. (<acronym>CMS</acronym>) qui comporte plusieurs niveaux de groupes au sein d'une grande
  156. variété de zones. Pour créer un nouvel objet <acronym>ACL</acronym>, nous créons une
  157. nouvelle instance d'<acronym>ACL</acronym> sans paramètres&#160;:
  158. </para>
  159. <programlisting language="php"><![CDATA[
  160. $acl = new Zend_Acl();
  161. ]]></programlisting>
  162. <note>
  163. <para>
  164. Jusqu'à ce que le développeur spécifie une règle "allow",
  165. <classname>Zend_Acl</classname> refuse l'accès pour tous les privilèges sur chaque
  166. ressource pour chaque rôle.
  167. </para>
  168. </note>
  169. </sect2>
  170. <sect2 id="zend.acl.introduction.role_registry">
  171. <title>Registre des rôles</title>
  172. <para>
  173. Les systèmes de gestion de contenu (ou <acronym>CMS</acronym>) vont pratiquement
  174. toujours nécessiter une hiérarchie de permissions afin de déterminer les droits de
  175. rédaction de ses utilisateurs. Il pourrait y avoir un groupe "Invités" qui donne accès
  176. aux démonstrations, un groupe "Staff" pour la majorité des utilisateurs du
  177. <acronym>CMS</acronym> qui réalisent la plupart du travail quotidien, un groupe
  178. "Éditeur" pour ceux qui sont responsables de la publication, l'archivage, la relecture
  179. et la suppression, et enfin un groupe "Administrateur" dont les tâches incluent toutes
  180. les tâches des autres groupes plus des tâches de maintenance, de gestion des
  181. utilisateurs, configuration et backup ou export. Cet ensemble de permissions peut être
  182. représenté dans un registre de rôles, permettant à chaque groupe d'hériter des
  183. privilèges des groupes "parents". Les permissions peuvent être rendues de la manière
  184. suivante&#160;:
  185. </para>
  186. <table id="zend.acl.introduction.role_registry.table.example_cms_access_controls">
  187. <title>Contrôles d'Accès pour un exemple de CMS</title>
  188. <tgroup cols="3">
  189. <thead>
  190. <row>
  191. <entry>Nom</entry>
  192. <entry>Permissions</entry>
  193. <entry>Permissions héritées de</entry>
  194. </row>
  195. </thead>
  196. <tbody>
  197. <row>
  198. <entry>Invité</entry>
  199. <entry>Voir</entry>
  200. <entry>N/A</entry>
  201. </row>
  202. <row>
  203. <entry>Staff</entry>
  204. <entry>Modifier, Soumettre, Relire</entry>
  205. <entry>Invité</entry>
  206. </row>
  207. <row>
  208. <entry>Éditeur</entry>
  209. <entry>Publier, Archiver, Supprimer</entry>
  210. <entry>Staff</entry>
  211. </row>
  212. <row>
  213. <entry>Administrateur</entry>
  214. <entry>(Reçoit tous les accès)</entry>
  215. <entry>N/A</entry>
  216. </row>
  217. </tbody>
  218. </tgroup>
  219. </table>
  220. <para>
  221. Pour cet exemple, <classname>Zend_Acl_Role</classname> est utilisé, mais
  222. n'importe quel objet qui implémente <classname>Zend_Acl_Role_Interface</classname> est
  223. acceptable. Ces groupes peuvent être ajoutés au registre des rôles comme suit&#160;:
  224. </para>
  225. <programlisting language="php"><![CDATA[
  226. $acl = new Zend_Acl();
  227. // Ajoute des groupes au registre des rôles en utilisant Zend_Acl_Role
  228. // Invité n'hérite d'aucun accès
  229. $roleinvite = new Zend_Acl_Role('invite');
  230. $acl->addRole($roleinvite);
  231. // Staff hérite de Invité
  232. $acl->addRole(new Zend_Acl_Role('staff'), $roleinvite);
  233. // Ce que précède pourrait aussi être écrit:
  234. // $acl->addRole(new Zend_Acl_Role('staff'), 'invite');
  235. // Editeur hérite de staff
  236. $acl->addRole(new Zend_Acl_Role('editeur'), 'staff');
  237. // Administrateur n'hérite pas d'accès
  238. $acl->addRole(new Zend_Acl_Role('administrateur'));
  239. ]]></programlisting>
  240. </sect2>
  241. <sect2 id="zend.acl.introduction.defining">
  242. <title>Définir les Contrôles d'Accès</title>
  243. <para>
  244. Maintenant que l'<acronym>ACL</acronym> contient les rôles nécessaires, on peut établir
  245. des règles qui définissent comment les ressources accèdent aux rôles. Vous avez sans
  246. doute noté que nous n'avons défini aucune ressource particulière pour cet exemple, ce
  247. qui est plus simple pour illustrer comment les règles s'appliquent à toutes les
  248. ressources. <classname>Zend_Acl</classname> fournit une implémentation dans laquelle les
  249. règles doivent simplement être assignées du général au particulier, ce qui réduit le
  250. nombre de règles spécifiques à ajouter. Ceci grâce à l'héritage.
  251. </para>
  252. <note>
  253. <para>
  254. Généralement <classname>Zend_Acl</classname> se conforme à une règle donnée
  255. si et seulement si une règle plus spécifique ne s'applique pas.
  256. </para>
  257. </note>
  258. <para>
  259. En conséquence, on peut définir un nombre assez complexe de règles avec un nombre
  260. minimal de code. Pour définir les permissions comme définies ci-dessus&#160;:
  261. </para>
  262. <programlisting language="php"><![CDATA[
  263. $acl = new Zend_Acl();
  264. $roleinvite = new Zend_Acl_Role('invité');
  265. $acl->addRole($roleinvite);
  266. $acl->addRole(new Zend_Acl_Role('staff'), $roleinvite);
  267. $acl->addRole(new Zend_Acl_Role('editeur'), 'staff');
  268. $acl->addRole(new Zend_Acl_Role('administrateur'));
  269. // Invité peut uniquement voir le contenu
  270. $acl->allow($roleinvite, null, 'voir');
  271. /*
  272. ce qui précède peut aussi être écrit :
  273. $acl->allow('invité', null, 'voir');
  274. */
  275. // Staff hérite des privilèges de Invité, mais a aussi ses propres
  276. // privilèges
  277. $acl->allow('staff', null, array('edit', 'submit', 'relire'));
  278. // Editeur hérite les privilèges voir, modifier, soumettre,
  279. // et relire de Staff, mais a aussi besoin de certains privilèges
  280. $acl->allow('editeur', null, array('publier', 'archiver', 'supprimer'));
  281. // Administrateur hérite de rien, mais reçoit tous les privilèges
  282. $acl->allow('administrateur');
  283. ]]></programlisting>
  284. <para>
  285. Les valeurs <constant>NULL</constant> dans les appels <methodname>allow()</methodname>
  286. ci-dessus sont utilisées pour indiquer que les règles s'appliquent à toutes les
  287. ressources.
  288. </para>
  289. </sect2>
  290. <sect2 id="zend.acl.introduction.querying">
  291. <title>Interroger les ACL</title>
  292. <para>
  293. Nous avons maintenant une <acronym>ACL</acronym> flexible, qui peut être utilisée pour
  294. déterminer si l'objet appelant a les permissions pour réaliser les fonctions au sein de
  295. l'application Web. Interroger cette liste est assez simple en utilisant la méthode
  296. <methodname>isAllowed()</methodname>&#160;:
  297. </para>
  298. <programlisting language="php"><![CDATA[
  299. echo $acl->isAllowed('invité', null, 'voir') ?
  300. "autorisé" : "refusé";
  301. // autorisé
  302. echo $acl->isAllowed('staff', null, 'publier') ?
  303. "autorisé" : "refusé";
  304. // refusé
  305. echo $acl->isAllowed('staff', null, 'relire') ?
  306. "autorisé" : "refusé";
  307. // autorisé
  308. echo $acl->isAllowed('editeur', null, 'voir') ?
  309. "autorisé" : "refusé";
  310. // autorisé parce que hérité de Invité
  311. echo $acl->isAllowed('editeur', null, 'modifier') ?
  312. "autorisé" : "refusé";
  313. // refusé parce qu'il n'y a pas de règle pour 'modifier'
  314. echo $acl->isAllowed('administrateur', null, 'voir') ?
  315. "autorisé" : "refusé";
  316. // autorisé car administrateur est autorisé pour tout
  317. echo $acl->isAllowed('administrateur') ?
  318. "autorisé" : "refusé";
  319. // autorisé car administrateur est autorisé pour tout
  320. echo $acl->isAllowed('administrateur', null, 'modifier') ?
  321. "autorisé" : "refusé";
  322. // autorisé car administrateur est autorisé pour tout
  323. ]]></programlisting>
  324. </sect2>
  325. </sect1>