Zend_Acl-Advanced.xml 5.1 KB

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