Zend_Acl-Refining.xml 6.7 KB

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