Zend_Acl-Refining.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.acl.refining">
  4. <title>Analiza kontroli dostępu</title>
  5. <sect2 id="zend.acl.refining.precise">
  6. <title>Precyzyjna kontrola dostępu</title>
  7. <para>
  8. Podstawowe <acronym>ACL</acronym> zdefiniowane w
  9. <link linkend="zend.acl.introduction">poprzedniej sekcji</link> pokazują
  10. jakie rozmaite uprawnienia mogą być dozwolone dla <acronym>ACL</acronym>
  11. (dla wszystkich zasobów). W praktyce, kontrola dostępu ma skłonność do
  12. posiadania wyjątków od reguł oraz różnych stopni skomplikowania.
  13. <classname>Zend_Acl</classname> pozwoli ci przeprowadzić te analizy
  14. w przystępny i elastyczny sposób.
  15. </para>
  16. <para>
  17. W przykładowej aplikacji <acronym>CMS</acronym>, zostało zdecydowane,
  18. że podczas gdy grupa 'staff' pokryje potrzeby większości użytkowników,
  19. potrzebna jest jeszcze jedna nowa grupa 'marketing', która wymaga dostępu
  20. do newslettera oraz ostatnich nowości w <acronym>CMS</acronym>. Ta grupa
  21. jest naprawdę samowystarczalna i będzie dawała możliwość publikowania oraz
  22. archiwizowania zarówno newsletterów jak i ostatnich nowości.
  23. </para>
  24. <para>
  25. Dodatkowo, zażądano także aby grupa 'staff' miała pozwolenie do
  26. przeglądania nowości, ale żeby nie mogła przeglądać ostatnich nowości.
  27. Dodatkowo, archiwizowanie 'zapowiedzi' nie powinno być w ogóle możliwe
  28. (nawet przez administratora), ponieważ ich okres ważności to 1-2 dni.
  29. </para>
  30. <para>
  31. Wpierw przejrzymy rejestr ról, aby rozważyć te zmiany. Określiliśmy, że
  32. grupa 'marketing' ma te same podstawowe uprawnienia co grupa 'staff',
  33. więc zdefiniujemy grupę 'marketing' w taki sposób, aby dziedziczyła
  34. uprawnienia od grupy 'staff':
  35. </para>
  36. <programlisting language="php"><![CDATA[
  37. // Nowa grupa marketing dziedziczy uprawnienia od grupy staff
  38. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  39. ]]></programlisting>
  40. <para>
  41. Zauważ, że powyższa kontrola dostępu odnosi się do określonych zasobów
  42. (np., "newsletter", "ostatnie nowości", "zapowiedzi"). Teraz dodamy te
  43. zasoby:
  44. </para>
  45. <programlisting language="php"><![CDATA[
  46. // Utwórz zasoby dla reguł
  47. // newsletter
  48. $acl->add(new Zend_Acl_Resource('newsletter'));
  49. // nowości
  50. $acl->add(new Zend_Acl_Resource('news'));
  51. // ostatnie nowości
  52. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  53. // zapowiedzi
  54. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  55. ]]></programlisting>
  56. <para>
  57. Teraz prostą sprawą jest zdefiniowanie bardziej specyficznych reguł
  58. na docelowych obszarach <acronym>ACL</acronym>:
  59. </para>
  60. <programlisting language="php"><![CDATA[
  61. // Grupa marketing musi mieć możliwość publikowania i archiwizowania
  62. // newsletterów oraz ostatnich nowości
  63. $acl->allow('marketing',
  64. array('newsletter', 'latest'),
  65. array('publish', 'archive'));
  66. // Grupa Staff (oraz marketing przez dziedziczenie), ma zabroniony dostęp
  67. // do przeglądania ostatnich nowości
  68. $acl->deny('staff', 'latest', 'revise');
  69. // Każdy (włączając w to administratorów) ma zabroniony dostęp do
  70. // archiwizowania zapowiedzi
  71. $acl->deny(null, 'announcement', 'archive');
  72. ]]></programlisting>
  73. <para>
  74. Teraz możemy przeprowadzić zapytanie do <acronym>ACL</acronym> z
  75. uwzględnieniem ostatnich zmian:
  76. </para>
  77. <programlisting language="php"><![CDATA[
  78. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  79. "allowed" : "denied";
  80. // zabronione
  81. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  82. "allowed" : "denied";
  83. // dozwolone
  84. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  85. "allowed" : "denied";
  86. // zabronione
  87. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  88. "allowed" : "denied";
  89. // dozwolone
  90. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  91. "allowed" : "denied";
  92. // dozwolone
  93. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  94. "allowed" : "denied";
  95. // zabronione
  96. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  97. "allowed" : "denied";
  98. // zabronione
  99. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  100. "allowed" : "denied";
  101. // zabronione
  102. ]]></programlisting>
  103. </sect2>
  104. <sect2 id="zend.acl.refining.removing">
  105. <title>Usuwanie kontroli dostępu</title>
  106. <para>
  107. Aby usunąć jedną lub więcej reguł z <acronym>ACL</acronym>, po prostu użyj
  108. dostępnych metod <methodname>removeAllow()</methodname> lub
  109. <methodname>removeDeny()</methodname>. Podobnie jak w metodach
  110. <methodname>allow()</methodname> oraz <methodname>deny()</methodname>,
  111. możesz podać wartość <constant>NULL</constant> aby oznaczyć wszystkie
  112. role, wszystkie zasoby i/lub wszystkie przywileje:
  113. </para>
  114. <programlisting language="php"><![CDATA[
  115. // Usunięcie zabronienia możliwości przeglądania ostatnich nowości
  116. // przez grupę staff (oraz marketing, przez dziedziczenie)
  117. $acl->removeDeny('staff', 'latest', 'revise');
  118. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  119. "allowed" : "denied";
  120. // dozwolone
  121. // Usunięcie wszystkich pozwoleń publikowania i archiwizowania newsletterów
  122. // przez grupę marketing
  123. $acl->removeAllow('marketing', 'newsletter', array('publish', 'archive'));
  124. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  125. "allowed" : "denied";
  126. // zabronione
  127. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  128. "allowed" : "denied";
  129. // zabronione
  130. ]]></programlisting>
  131. <para>
  132. Przywileje mogą być modyfikowane inkrementalnie jak pokazano wyżej, ale
  133. wartość <constant>NULL</constant> dla przywilejów nadpisuje te inkrementalne
  134. zmiany:
  135. </para>
  136. <programlisting language="php"><![CDATA[
  137. // Nadanie grupie marketing wszystkich uprawnień związanych z ostatnimi nowościami
  138. $acl->allow('marketing', 'latest');
  139. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  140. "allowed" : "denied";
  141. // dozwolone
  142. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  143. "allowed" : "denied";
  144. // dozwolone
  145. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  146. "allowed" : "denied";
  147. // dozwolone
  148. ]]></programlisting>
  149. </sect2>
  150. </sect1>