Zend_Acl-Advanced.xml 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <sect1 id="zend.acl.advanced">
  2. <title>Zaawansowane użycie</title>
  3. <sect2 id="zend.acl.advanced.storing">
  4. <title>Trwałe przechowywanie danych ACL</title>
  5. <para>
  6. Klasa Zend_Acl została zaprojektowana w taki sposób, aby nie wymagała
  7. żadnej szczególnej technologii backendu do przechowywania danych ACL
  8. takiej jak np. baza danych czy serwer buforujący. Kompletna
  9. implementacja w PHP pozwala na podstawie Zend_Acl budować dostosowane
  10. narzędzia administracyjne, które są relatywnie łatwe oraz elastyczne.
  11. Wiele sytuacji wymaga pewnej formy interaktywnego zarządzania ACL, a
  12. Zend_Acl zapewnia metody do ustawiania oraz odpytywania kontroli
  13. dostępu aplikacji.
  14. </para>
  15. <para>
  16. Przechowywanie danych ACL jest zadaniem pozostawionym dla programisty,
  17. dlatego, że przykłady użycia mogą się bardzo różnić w rozmaitych
  18. sytuacjach. Ponieważ możliwe jest serializowanie Zend_Acl, obiekty ACL
  19. mogą być serializowane za pomocą funkcji PHP
  20. <ulink url="http://php.net/serialize"><code>serialize()</code></ulink>,
  21. a wyniki mogą być przechowane tam gdzie określi to programista, na
  22. przykład w pliku, w bazie danych lub w mechanizmie buforowania.
  23. </para>
  24. </sect2>
  25. <sect2 id="zend.acl.advanced.assertions">
  26. <title>Tworzenie warunkowych reguł ACL z zapewnieniami</title>
  27. <para>
  28. Czasem reguła przyznawania lub zabraniania dostępu roli do zasobu nie
  29. powinna być absolutna, ale powinna być oparta na różnych kryteriach.
  30. Na przykład załóżmy, że pewien dostęp powinien być przyznany, ale
  31. jedynie między godziną 8:00 a 17:00. Innym przykładem może być zabranie
  32. dostępu adresom IP, które zostały oznaczone jako źródło nadużyć.
  33. Zend_Acl ma wbudowaną obsługę implementowania reguł opartych na
  34. dowolnych warunkach, wedle potrzeb programisty.
  35. </para>
  36. <para>
  37. Zend_Acl zapewnia obsługę warunkowych reguł za pomocą interfejsu
  38. <code>Zend_Acl_Assert_Interface</code>. W celu użycia interfejsu
  39. zapewnień reguł, programista pisze klasę, ktora implementuje metodę
  40. <code>assert()</code> interfejsu:
  41. </para>
  42. <programlisting role="php"><![CDATA[
  43. class CleanIPAssertion implements Zend_Acl_Assert_Interface
  44. {
  45. public function assert(Zend_Acl $acl,
  46. Zend_Acl_Role_Interface $role = null,
  47. Zend_Acl_Resource_Interface $resource = null,
  48. $privilege = null)
  49. {
  50. return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
  51. }
  52. protected function _isCleanIP($ip)
  53. {
  54. // ...
  55. }
  56. }
  57. ]]>
  58. </programlisting>
  59. <para>
  60. Kiedy klasa zapewnień jest już dostępna, programista musi przekazać
  61. klasę zapewnień kiedy przypisuje regułę warunkową. Reguła, która jest
  62. utworzona z klasą zapewnienia będzie jedynie stosowana wtedy, gdy metoda
  63. zapewnienia zwróci logiczną wartośc true.
  64. </para>
  65. <programlisting role="php"><![CDATA[
  66. $acl = new Zend_Acl();
  67. $acl->allow(null, null, null, new CleanIPAssertion());
  68. ]]>
  69. </programlisting>
  70. <para>
  71. Powyższy kod tworzy warunkową regułę dostępu, ktora pozwala na dostęp
  72. do wszystkich przywilejów do wszystkich zasobów dla wszystkich ról, z
  73. wyjątkiem adresów IP, będących na czarnej liście. Jeśli żądanie pochodzi
  74. z adresu IP, który nie jest uznany jako "czysty", wtedy reguła nie ma
  75. zastosowania. Z tego względu, że reguła ma zastosowanie do wszystkich
  76. ról, zasobów oraz przywilejów, zablokowany adres IP będzie miał
  77. zabroniony cały dostęp. Jest to specjalny przypadek i powinien być
  78. zrozumiany tak, że we wszystkich innych przypadkach (np., tam gdzie
  79. specyficzna rola, zasób lub przywilej są określone w regule), nieudane
  80. zapewnienie spowoduje, że reguła nie zostanie zastosowana i inne reguły
  81. powinny być zastosowane aby określić czy dostęp jest dozwolony czy
  82. zabroniony.
  83. </para>
  84. <para>
  85. Metoda <code>assert()</code> obiektu zapewnienia jest przekazywana do
  86. ACL, roli, zasobu, oraz przywileju do których stosuje się zapytanie
  87. autoryzacyjne (np., <code>isAllowed()</code>), w celu dostarczenia
  88. kontekstu dla klasy zapewnienia aby określić warunki zapewnienia tam
  89. gdzie są one potrzebne.
  90. </para>
  91. </sect2>
  92. </sect1>