Zend_Acl.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. <sect1 id="zend.acl.introduction">
  2. <title>Introductie</title>
  3. <para>
  4. Zend_Acl levert een lichte en flexibele toegangscontrolelijst (ACL) functionaliteit
  5. en rechten beheer. In het algemeen, een applicatie mag deze functionaliteit benutten
  6. om de toegang tot bepaalde beschermde objecten door andere vragende objecten te controleren.
  7. </para>
  8. <para>
  9. Binnen deze documentatie spreken we af,
  10. <itemizedlist>
  11. <listitem>
  12. <para>
  13. Een <emphasis role="strong">Bron</emphasis> is een object waarvan
  14. de toegang wordt gecontroleerd.
  15. </para>
  16. </listitem>
  17. <listitem>
  18. <para>
  19. Een <emphasis role="strong">Rol</emphasis> is een object dat toegang
  20. vraagt tot een bron.
  21. </para>
  22. </listitem>
  23. </itemizedlist>
  24. Simpel gezegd, <emphasis role="strong">Rollen vragen toegang tot bronnen</emphasis>.
  25. Een voorbeeld, als een persoon toegang vraagt tot een auto, dan is de vragende persoon
  26. een rol en de auto is de bron, want de toegang tot de auto wordt gecontroleerd.
  27. </para>
  28. <para>
  29. Door de specificatie en het gebruiken van een toegangscontrolelijst (ACL), kan een applicatie
  30. controleren of vragende objecten (Rollen) zijn toegestaan om beschermde objecten (Bronnen)
  31. te gebruiken.
  32. </para>
  33. <sect2 id="zend.acl.introduction.resources">
  34. <title>Over Bronnen</title>
  35. <para>
  36. In Zend_Acl is het maken van een bron heel simpel. Zend_Acl heeft een
  37. <code>Zend_Acl_Resource_Interface</code> om het ontwikkelaars makkelijk te maken bij het
  38. maken van Bronnen. Een klasse hoeft deze interface alleen maar te implementeren, en bestaat
  39. uit een enkele methode, <code>getResourceId()</code>, om Zend_Acl het object als een Bron
  40. te laten beschouwen. Verder wordt <code>Zend_Acl_Resource</code> gebruikt binnen Zend_Acl
  41. als een standaard Bron implementatie voor ontwikkelaars die uitgebreid kan worden waar wenselijk.
  42. </para>
  43. <para>
  44. Zend_Acl levert een boom structuur waaraan meerdere Bronnen ( of "gebieden onder toegangscontrole" )
  45. aan toegevoegd kunnen worden. Omdat Bronnen opgeslagen worden in zo'n boom structuur, kunnen ze
  46. algemeen ( tot aan de top van de boom ) tot specifiek ( tot de blaadjes van de boom ) geregeld worden.
  47. Vragen aan een specifieke Bron zullen automatisch de Bronnen hiërarchie doorzoeken naar regels
  48. verbonden met ouderlijke Bronnen, wat een simpele overerving van regels mogelijk maakt. Als voorbeeld,
  49. als een standaard regel moet worden toegepast op ieder gebouw binnen een stad, dan verbind je die
  50. regel met de stad, in plaats van aan ieder gebouw. Sommige gebouwen hebben wellicht uitzonderingen op
  51. die regel en dit is vrij makkelijk te bereiken binnen Zend_Acl door die uitzonderingsregels te
  52. verbinden met ieder gebouw die een uitzondering heeft. Een Bron mag maar van een ouder Bron erven,
  53. maar deze ouder Bron kan zijn eigen ouder Bron hebben, etc etc.
  54. </para>
  55. <para>
  56. Zend_Acl ondersteunt ook privileges op Bronnen (zoals, "maak", "lees", "update", "verwijder"), en
  57. de ontwikkelaar kan regels toekennen die effect hebben op alle privileges of specifieke privileges
  58. op een Bron.
  59. </para>
  60. </sect2>
  61. <sect2 id="zend.acl.introduction.roles">
  62. <title>Over Rollen</title>
  63. <para>
  64. Net als bij Bronnen, is het aanmaken van een Rol ook heel simpel. Zend_Acl levert
  65. <code>Zend_Acl_Role_Interface</code> om het ontwikkelaars makkelijk te maken bij het maken
  66. van een Rol. Een klasse hoeft deze interface alleen maar te implementeren, en bestaat
  67. uit een enkele methode, <code>getRoleId()</code>, om Zend_Acl het object als een Rol
  68. te laten beschouwen. Verder wordt <code>Zend_Acl_Role</code> gebruikt binnen Zend_Acl
  69. als een standaard Rol implementatie voor ontwikkelaars die uitgebreid kan worden waar wenselijk.
  70. </para>
  71. <para>
  72. In Zend_Acl, mag een Rol erven van één of meer Rollen. Dit is om overerving van regels
  73. tussen Rollen mogelijk te maken. Als voorbeeld, een gebruiker Rol, zoals "sally", kan behoren tot
  74. één of meer ouder Rollen, zoals "redacteur" en "administrator". De ontwikkelaar kan apart regels
  75. toekennen aan "redacteur" en "administrator" en "sally" erft deze regels van beide, zonder dat
  76. deze regels direct aan "sally" zijn toegekend.
  77. </para>
  78. <para>
  79. Hoewel de mogelijkheid om te erven van meerdere Rollen heel makkelijk is, brengt meedere
  80. overervingen een zekere mate van complexiteit met zich mee. Het volgende voorbeeld illustreert
  81. een tegenstrijdige bepaling en hoe Zend_Acl dit oplost.
  82. </para>
  83. <example id="zend.acl.introduction.roles.example.multiple_inheritance">
  84. <title>Meerdere overervingen tussen rollen</title>
  85. <para>
  86. De volgende code defineerd 3 basis Rollen - "<code>gast</code>", "<code>lid</code>", en
  87. "<code>admin</code>" - waarvan andere Rollen kunnen erven. Vervolgens, wordt er een Rol,
  88. met de identiteit "<code>eenGebruiker</code>" aangemaakt die van alle drie de Rollen erft.
  89. De volgorde waarin deze rollen staan in de <code>$ouders</code> array is van belang.
  90. Als het nodig is, zoekt Zend_Acl niet alleen naar toegangsregels voor de geraadpleegde Rol
  91. ( in dit voorbeeld "<code>eenGebruiker</code>"), maar ook in de Rollen waar de geraadpleegde
  92. Rol van erft (in dit voorbeeld "<code>gast</code>", "<code>lid</code>", en "<code>admin</code>"):
  93. </para>
  94. <programlisting role="php"><![CDATA[<?php
  95. require_once 'Zend/Acl.php';
  96. $acl = new Zend_Acl();
  97. require_once 'Zend/Acl/Role.php';
  98. $acl->addRole(new Zend_Acl_Role('gast'))
  99. ->addRole(new Zend_Acl_Role('lid'))
  100. ->addRole(new Zend_Acl_Role('admin'));
  101. $ouders = array('gast', 'lid', 'admin');
  102. $acl->addRole(new Zend_Acl_Role('eenGebruiker'), $ouders);
  103. require_once 'Zend/Acl/Resource.php';
  104. $acl->add(new Zend_Acl_Resource('eenBron'));
  105. $acl->deny('gast', 'eenBron');
  106. $acl->allow('lid', 'eenBron');
  107. echo $acl->isAllowed('eenGebruiker', 'eenBron') ? 'toegestaan' : 'weigeren';]]>
  108. </programlisting>
  109. <para>
  110. Omdat er geen regel is gespecificeerd voor de "<code>eenGebruiker</code>" Rol en
  111. "<code>eenBron</code>", gaat Zend_Acl opzoek naar regels die mogelijk gedefineerd zijn
  112. voor Rollen waar "<code>eenGebruiker</code>" van erft. Als eerste wordt de "<code>admin</code>"
  113. Rol geraadpleegd, hiervoor is geen toegang regel gedefineerd. Daarna wordt de
  114. "<code>lid</code>" Rol geraadpleegd, en Zend_Acl vindt hier een regel dat "<code>lid</code>"
  115. toegestaan is om "<code>eenBron</code>" te gebruiken.
  116. </para>
  117. <para>
  118. Als Zend_Acl door zou gaan met raadplegen van regels gedefineerd voor andere ouder Rollen,
  119. dan zou hij vinden dat "<code>gast</code>" geen toegang heeft om "<code>eenBron</code>" te
  120. gebruiken. Dit feit introduceert een tegenstrijdigheid want nu is "<code>eenGebruiker</code>"
  121. zowel toegestaan als geweigerd om "<code>eenBron</code>" te gebruiken, veroorzaakt door het erven van
  122. conflicterende regels van verschillende ouder Rollen.
  123. </para>
  124. <para>
  125. Zend_Acl lost deze tegenstrijdigheid op door de raadpleging te beëindigen zodra de eerste regel
  126. gevonden wordt die direct toepasbaar is op de vraag. In dit geval, omdat de "<code>lid</code>"
  127. Rol eerder geraadpleegd wordt dan "<code>gast</code>", zal de voorbeeld code "toegestaan" weergeven.
  128. </para>
  129. </example>
  130. <note>
  131. <para>
  132. Wanneer je meerdere ouders specificeerd voor een Rol, hou dan in gedachten dat de laatste ouder
  133. in de lijst als eerste doorzocht wordt op regels die toepasbaar zijn op de autorisatie vraag.
  134. </para>
  135. </note>
  136. </sect2>
  137. <sect2 id="zend.acl.introduction.creating">
  138. <title>Maken van de toegangscontrolelijst (ACL)</title>
  139. <para>
  140. Een ACL kan iedere groep van fysieke en virtuele objecten bevatten die je wenst.
  141. Als demonstratie creëren we een basis Content Management Systeem ACL die verschillende niveaus van
  142. groepen bevat. Voor het maken van een ACL object, moeten we de ACL instantiëren zonder parameters:
  143. </para>
  144. <programlisting role="php"><![CDATA[<?php
  145. require_once 'Zend/Acl.php';
  146. $acl = new Zend_Acl();]]>
  147. </programlisting>
  148. <note>
  149. <para>
  150. Totdat een ontwikkelaar een toestaan regel specificeerd, zal Zend_Acl toegang tot iedere privilege
  151. van iedere Bron verbieden voor elke Rol.
  152. </para>
  153. </note>
  154. </sect2>
  155. <sect2 id="zend.acl.introduction.role_registry">
  156. <title>Registeren van Rollen</title>
  157. <para>
  158. Content Management Systemen zullen bijna altijd een hiërarchie van rechten nodig hebben
  159. om de rechten van zijn gebruikers te bepalen. Er is bijvoorbeeld een 'gast' groep om
  160. gelimiteerde toegang voor demonstraties toe te staan, een 'medewerker' groep voor het
  161. meerendeel van de CMS gebruikers die de dagelijkse acties uitvoeren, een 'redacteur' groep
  162. voor diegene die verantwoordelijke zijn voor herzien, acrhieveren en verwijderen van content
  163. en een 'administrator' groep die alles van de andere groepen mag en onderhoud mag plegen aan
  164. gevoelige informatie, gebruikersbeheer, configuraties aanpassen en gegevens backuppen/ exporteren.
  165. Deze rechten worden verzameld in een Rol lijst, waarin elke groep privileges mag erven
  166. van 'ouder' groepen en enkele privileges voor hun unieke groep kunnen hebben.
  167. De rechten kunnen als volgt worden weergegeven:
  168. </para>
  169. <table id="zend.acl.introduction.role_registry.table.example_cms_access_controls">
  170. <title>Toegang controle voor een voorbeeld CMS</title>
  171. <tgroup cols="3">
  172. <thead>
  173. <row>
  174. <entry>Naam</entry>
  175. <entry>Unieke rechten</entry>
  176. <entry>Erft rechten van</entry>
  177. </row>
  178. </thead>
  179. <tbody>
  180. <row>
  181. <entry>Gast</entry>
  182. <entry>Bekijk</entry>
  183. <entry>N/A</entry>
  184. </row>
  185. <row>
  186. <entry>Medewerker</entry>
  187. <entry>Wijzig, Verzenden, Herzien</entry>
  188. <entry>Gast</entry>
  189. </row>
  190. <row>
  191. <entry>Redacteur</entry>
  192. <entry>Publiceren, Archiveren, Verwijderen</entry>
  193. <entry>Medewerker</entry>
  194. </row>
  195. <row>
  196. <entry>Administrator</entry>
  197. <entry>Heeft alle rechten</entry>
  198. <entry>N/A</entry>
  199. </row>
  200. </tbody>
  201. </tgroup>
  202. </table>
  203. <para>
  204. Als voorbeeld wordt <code>Zend_Acl_Role</code> gebruikt, maar ieder object dat
  205. <code>Zend_Acl_Role_Interface</code> implementeert kan gebruikt worden.
  206. De groepen kunnen toegevoegd worden aan de Rol lijst op de volgende manier:
  207. </para>
  208. <programlisting role="php"><![CDATA[<?php
  209. require_once 'Zend/Acl.php';
  210. $acl = new Zend_Acl();
  211. // Voeg groepen toe aan de Rol lijst van Zend_Acl_Role
  212. require_once 'Zend/Acl/Role.php';
  213. // Gast erft geen oudelijke Rollen
  214. $rolGast = new Zend_Acl_Role('gast');
  215. $acl->addRole($rolGast);
  216. // Medewerker erft van gast
  217. $acl->addRole(new Zend_Acl_Role('medewerker'), $rolGast);
  218. /* Bovenstaande kan ook geschreven worden als:
  219. $acl->addRole(new Zend_Acl_Role('medewerker'), 'gast');
  220. */
  221. // Redacteur erft van medewerker
  222. $acl->addRole(new Zend_Acl_Role('redacteur'), 'medewerker');
  223. // Administrator erft geen ouder Rollen
  224. $acl->addRole(new Zend_Acl_Role('administrator'));]]>
  225. </programlisting>
  226. </sect2>
  227. <sect2 id="zend.acl.introduction.defining">
  228. <title>Defineren van de toegangscontrole</title>
  229. <para>
  230. Nu de ACL de relevante Rollen bevat, kunnen de regels worden opgesteld die defineren hoe
  231. Bronnen kunnen worden gebruikt door Rollen. Het is je misschien opgevallen dat we geen Bronnen
  232. hebben gespecificeerd in dit voorbeeld, wat erop neer komt dat de regels gelden voor alle Bronnen.
  233. Zend_Acl levert een inplementatie waarbij regels enkel te worden toegekend van algemeen tot specifiek,
  234. dit verkleint het aantal regels wat nodig is, want Bronnen en Rollen erven regels die zijn gedefineerd voor
  235. hun ouders.
  236. </para>
  237. <note>
  238. <para>In het algemeen, staat Zend_Acl een regel toe als een meer specifiekere regel niet bestaat.</para></note>
  239. <para>
  240. We kunnen dus een redelijke complexe groep van regels defineren met een kleine hoeveelheid code.
  241. Om de basisregels toe te passen zoals hierboven staan beschreven:
  242. </para>
  243. <programlisting role="php"><![CDATA[<?php
  244. require_once 'Zend/Acl.php';
  245. $acl = new Zend_Acl();
  246. require_once 'Zend/Acl/Role.php';
  247. $rolGast = new Zend_Acl_Role('gast');
  248. $acl->addRole($rolGast);
  249. $acl->addRole(new Zend_Acl_Role('medewerker'), $rolGast);
  250. $acl->addRole(new Zend_Acl_Role('redacteur'), 'medewerker');
  251. $acl->addRole(new Zend_Acl_Role('administrator'));
  252. // Gast mag alleen content bekijken
  253. $acl->allow($rolGast, null, 'bekijk');
  254. /* Bovenstaande kan ook geschreven worden als:
  255. $acl->allow('gast', null, 'bekijk');
  256. */
  257. // Medewerker erft het bekijk privilege van gast, maar heeft extra privileges
  258. $acl->allow('medewerker', null, array('wijzig', 'verzend', 'herzien'));
  259. // Redacteur erft bekijk, wijzig, verzend en herzien privileges van medewerker
  260. // maar heeft extra prvileges
  261. $acl->allow('redacteur', null, array('publiceer', 'archiveer', 'verwijder'));
  262. // Administrator erft niets, maar is alle privileges toegestaan
  263. $acl->allow('administrator');]]>
  264. </programlisting>
  265. <para>
  266. De <code>null</code> waarde in bovenstaande <code>allow()</code> aanroepen worden gebruikt
  267. om aan te geven dat de toestaan regels op alle Bronnen van toepassing zijn.
  268. </para>
  269. </sect2>
  270. <sect2 id="zend.acl.introduction.querying">
  271. <title>Raadplegen van de ACL</title>
  272. <para>
  273. We hebben nu een flexibele ACL die gebruikt kan worden om te bepalen of de aanvrager
  274. toestemming heeft om de actie uit te voeren binnen de web applicatie. Raadplegen is
  275. vrij simpel met het gebruik van de <code>isAllowed()</code> methode:
  276. </para>
  277. <programlisting role="php"><![CDATA[<?php
  278. echo $acl->isAllowed('gast', null, 'bekijk') ?
  279. "toegestaan" : "geweigerd"; // toegestaan
  280. echo $acl->isAllowed('medewerker', null, 'publiseer') ?
  281. "toegestaan" : "geweigerd"; // geweigerd
  282. echo $acl->isAllowed('medewerker', null, 'herzien') ?
  283. "toegestaan" : "geweigerd"; // toegestaan
  284. echo $acl->isAllowed('redacteur', null, 'bekijk') ?
  285. "toegestaan" : "geweigerd"; // toegestaan vanwege de overerving van gast
  286. echo $acl->isAllowed('redacteur', null, 'update') ?
  287. "toegestaan" : "geweigerd"; // geweigerd want er is geen toestaan regel voor 'update'
  288. echo $acl->isAllowed('administrator', null, 'bekijk') ?
  289. "toegestaan" : "geweigerd"; // toegestaan want administrator is alles toegestaan
  290. echo $acl->isAllowed('administrator') ?
  291. "toegestaan" : "geweigerd"; // toegestaan want administrator is alles toegestaan
  292. echo $acl->isAllowed('administrator', null, 'update') ?
  293. "toegestaan" : "geweigerd"; // toegestaan want administrator is alles toegestaan]]>
  294. </programlisting>
  295. </sect2>
  296. </sect1>
  297. <!--
  298. vim:se ts=4 sw=4 et:
  299. -->