Zend_Acl-Refining.xml 6.6 KB

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