Zend_Acl-Refining.xml 6.9 KB

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