Zend_Acl-Refining.xml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20763 -->
  3. <!-- Reviewed: 20763 -->
  4. <sect1 id="zend.acl.refining">
  5. <title>Verfeinern der Zugriffskontrolle</title>
  6. <sect2 id="zend.acl.refining.precise">
  7. <title>Präzise Zugangsbeschränkung</title>
  8. <para>
  9. Die grundlegende
  10. <acronym>ACL</acronym>
  11. , wie sie im
  12. <link linkend="zend.acl.introduction">vorherigen Kapitel</link>
  13. definiert ist, zeigt wie
  14. verschiedene Rechte für die gesamte
  15. <acronym>ACL</acronym>
  16. (alle Ressourcen) vergeben
  17. werden können. In der Praxis tendieren Zugangsbeschränkungen jedoch eher
  18. dahin,
  19. Ausnahmen und verschiedene Stufen von Komplexität zu haben.
  20. <classname>Zend_Acl</classname>
  21. erlaubt einem, diese Verfeinerungen auf einfache und
  22. flexible Weise zu bewerkstelligen.
  23. </para>
  24. <para>
  25. Für das Beispiel
  26. <acronym>CMS</acronym>
  27. wurde ermittelt, dass während die Gruppe
  28. 'staff' die Bedürfnisse der überwiegenden Mehrheit der Benutzer abdeckt, es
  29. den Bedarf
  30. für eine neue Gruppe 'marketing' gibt, die Zugriff auf den Newsletter
  31. und die neuesten
  32. Nachrichten im
  33. <acronym>CMS</acronym>
  34. benötigen. Die Gruppe ist ziemlich unabhängig und
  35. wird die Möglichkeit haben, sowohl Newsletter als auch die neuesten
  36. Nachrichten zu
  37. veröffentlichen und zu archivieren.
  38. </para>
  39. <para>
  40. Zusätzlich wurde angefordert, dass es der Gruppe 'staff' erlaubt sein soll, die
  41. Nachrichten ansehen, aber nicht die neuesten Nachrichten überarbeiten
  42. zu können.
  43. Letztendlich soll es für jeden (Administratoren eingeschlossen) unmöglich sein,
  44. irgend
  45. eine Bekanntmachung zu archivieren, da diese sowieso nur eine Lebensdauer
  46. von 1 bis 2
  47. Tagen haben.
  48. </para>
  49. <para>
  50. Zuerst überarbeiten wir die Rollenregistrierung, um die Änderungen wider zu
  51. spiegeln.
  52. Wir haben ermittelt, dass die Gruppe 'marketing' dieselben grundlegenden
  53. Rechte wie
  54. 'staff' hat, also definieren wir 'marketing' so, dass die Genehmigungen von
  55. 'staff'
  56. geerbt werden:
  57. </para>
  58. <programlisting language="php"><![CDATA[
  59. // Die neue Gruppe Marketing erbt Genehmigungen der Mitarbeiter
  60. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  61. ]]></programlisting>
  62. <para>
  63. Als nächstes ist zu beachten, dass sich die obige Zugangsbeschränkung
  64. auf bestimmte
  65. Ressourcen bezieht (z.B. "newsletter", "lastest news", "announcement news").
  66. Nun fügen
  67. wir die Ressourcen hinzu:
  68. </para>
  69. <programlisting language="php"><![CDATA[
  70. // Ressourcen für die Regeln erstellen
  71. // Newsletter
  72. $acl->addResource(new Zend_Acl_Resource('newsletter'));
  73. // Nachrichten
  74. $acl->addResource(new Zend_Acl_Resource('news'));
  75. // Neueste Nachrichten
  76. $acl->addResource(new Zend_Acl_Resource('latest'), 'news');
  77. // Bekanntmachungen
  78. $acl->addResource(new Zend_Acl_Resource('announcement'), 'news');
  79. ]]></programlisting>
  80. <para>
  81. Nun ist es nur eine Frage der Definition für diese spezifischeren
  82. Regeln auf die
  83. Zielbereiche der
  84. <acronym>ACL</acronym>
  85. :
  86. </para>
  87. <programlisting language="php"><![CDATA[
  88. // Marketing muss Newsletter und die neuesten Nachrichten veröffentlichen
  89. // und archivieren können
  90. $acl->allow('marketing',
  91. array('newsletter', 'latest'),
  92. array('publish', 'archive'));
  93. // Staff (und Marketing durch die Vererbung), wird die Erlaubnis verweigert,
  94. // die neuesten Nachrichten überarbeiten zu können
  95. $acl->deny('staff', 'latest', 'revise');
  96. // Jedem (inklusive der Administratoren) wird die Erlaubnis verweigert,
  97. // Bekanntmachungsnachricht zu archivieren
  98. $acl->deny(null, 'announcement', 'archive');
  99. ]]></programlisting>
  100. <para>
  101. Wir können nun die
  102. <acronym>ACL</acronym>
  103. hinsichtlich der letzten Änderungen abfragen:
  104. </para>
  105. <programlisting language="php"><![CDATA[
  106. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  107. "allowed" : "denied";
  108. // verweigert
  109. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  110. "allowed" : "denied";
  111. // erlaubt
  112. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  113. "allowed" : "denied";
  114. // verweigert
  115. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  116. "allowed" : "denied";
  117. // erlaubt
  118. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  119. "allowed" : "denied";
  120. // erlaubt
  121. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  122. "allowed" : "denied";
  123. // verweigert
  124. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  125. "allowed" : "denied";
  126. // verweigert
  127. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  128. "allowed" : "denied";
  129. // verweigert
  130. ]]></programlisting>
  131. </sect2>
  132. <sect2 id="zend.acl.refining.removing">
  133. <title>Zugangsbeschränkungen entfernen</title>
  134. <para>
  135. Um eine oder mehrere Zugangsregel von der
  136. <acronym>ACL</acronym>
  137. zu entfernen,
  138. verwendet man einfach die vorhandenen Methoden
  139. <methodname>removeAllow()</methodname>
  140. oder
  141. <methodname>removeDeny()</methodname>
  142. . Wie bei
  143. <methodname>allow()</methodname>
  144. und
  145. <methodname>deny()</methodname>
  146. kann man den
  147. <constant>NULL</constant>
  148. Wert übergeben, um die Anwendung auf alle Rollen, Ressourcen
  149. und / oder Rechte anzuzeigen:
  150. </para>
  151. <programlisting language="php"><![CDATA[
  152. // Entferne die Verweigerung, die letzten Nachrichten zu überarbeiten für
  153. // die Mitarbeiter (und Marketing durch die Vererbung)
  154. $acl->removeDeny('staff', 'latest', 'revise');
  155. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  156. "allowed" : "denied";
  157. // erlaubt
  158. // Entferne die Erlaubnis für das Marketing, Newsletter veröffentlichen und
  159. // archivieren zu können
  160. $acl->removeAllow('marketing',
  161. 'newsletter',
  162. array('publish', 'archive'));
  163. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  164. "allowed" : "denied";
  165. // verweigert
  166. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  167. "allowed" : "denied";
  168. // verweigert
  169. ]]></programlisting>
  170. <para>
  171. Rechte können schrittweise wie oben angezeigt verändert werden, aber
  172. ein
  173. <constant>NULL</constant>
  174. -Wert für die Rechte überschreibt solche schrittweisen
  175. Änderungen:
  176. </para>
  177. <programlisting language="php"><![CDATA[
  178. // Erlaube dem Marketing alle Rechte für die neuesten Nachrichten
  179. $acl->allow('marketing', 'latest');
  180. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  181. "allowed" : "denied";
  182. // erlaubt
  183. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  184. "allowed" : "denied";
  185. // erlaubt
  186. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  187. "allowed" : "denied";
  188. // erlaubt
  189. ]]></programlisting>
  190. </sect2>
  191. </sect1>