Zend_Acl-Advanced.xml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <sect1 id="zend.acl.advanced">
  2. <title>Penggunaan Tingkat Lanjut</title>
  3. <sect2 id="zend.acl.advanced.storing">
  4. <title>Menyimpan data ACL</title>
  5. <para>
  6. Zend_Acl didesain sedemikian rupa sehingga ia tidak bergantung pada teknologi backend seperti database
  7. atau server cache untuk menyimpan data ACL. Zend_Acl sepenuhnya diimplementasikan dalam kode PHP
  8. sehingga perangkat administrasi lainnya (seperti penyimpanan data ACL) dapat dibangun di atasnya
  9. dengan relatif mudah dan fleksibel. Sebab terkadang kita perlu mengelola ACL ini secara interaktif,
  10. tidak persistence seperti halnya kalau kita menyimpan dalam database. Untuk itu Zend_Acl menyediakan
  11. method untuk melakukan setup dan query ACL dari aplikasi secara dinamis.
  12. </para>
  13. <para>
  14. Dengan kata lain, penyimpanan data ACL diserahkan sepenuhnya kepada developer, karena penggunaan tempat
  15. penyimpanan data ACL sangat beragam dan berbeda untuk tiap aplikasi. Yang jelas, objek Zend_Acl
  16. dapat diserialisasikan, dan dengan menggunakan fungsi
  17. <ulink url="http://php.net/serialize"><code>serialize()</code></ulink> di PHP, anda dapat menyimpan
  18. hasil keluarannya ke tempat penyimpanan sesuai keinginan anda. Bisa ke dalam file, database atau
  19. mekanisme caching.
  20. </para>
  21. </sect2>
  22. <sect2 id="zend.acl.advanced.assertions">
  23. <title>Aturan Kondisional ACL dengan Assertion</title>
  24. <para>
  25. Terkadang aturan ACL untuk memperbolehkan atau melarang akses ke resource tertentu tidak absolut melainkan
  26. bergantung pada beberapa kondisi. Misalnya sebuah resource bisa diakses oleh role tertentu, tapi hanya
  27. antara jam 8.00 pagi sampai jam 5.00 sore. Contoh kasus lain adalah resource tertentu tidak bisa diakses oleh
  28. pengunjung dengan IP tertentu karena sudah ditandai sebagai sumber ancaman. Zend_Acl memiliki dukungan
  29. built-in untuk mengimplementasikan aturan kondisional seperti ini.
  30. </para>
  31. <para>
  32. Penerapan aturan kondisional seperti ini (atau assertion) dilakukan dengan menggunakan <code>Zend_Acl_Assert_Interface</code>.
  33. Untuk menggunakan interface ini, developer harus membuat sebuah class terlebih dahulu yang mengimplementasikan
  34. method <code>assert()</code> dari interface tersebut:
  35. </para>
  36. <programlisting role="php"><![CDATA[
  37. class CleanIPAssertion implements Zend_Acl_Assert_Interface
  38. {
  39. public function assert(Zend_Acl $acl,
  40. Zend_Acl_Role_Interface $role = null,
  41. Zend_Acl_Resource_Interface $resource = null,
  42. $privilege = null)
  43. {
  44. return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
  45. }
  46. // di sini dibuat mekanisme untuk memeriksa apakah $ip
  47. // tergolong aman dan tidak masuk dalam daftar blacklist
  48. // keluaran: true jika aman, false jika tidak aman
  49. protected function _isCleanIP($ip)
  50. {
  51. // ...
  52. }
  53. }
  54. ]]>
  55. </programlisting>
  56. <para>
  57. Setelah class assertion ini siap, anda tinggal menambahkan instance class tersebut dalam penentuan
  58. aturan ACL. Aturan yang disertai class assertion seperti ini hanya berlaku jika class assertion
  59. mengeluarkan nilai <code>true</code> (benar).
  60. </para>
  61. <programlisting role="php"><![CDATA[
  62. $acl = new Zend_Acl();
  63. $acl->allow(null, null, null, new CleanIPAssertion());
  64. ]]>
  65. </programlisting>
  66. <para>
  67. Kode di atas membuat aturan yang memperbolehkan siapapun untuk melakukan apapun
  68. pada semua resource, kecuali ketika orang tersebut menggunakan IP yang masuk daftar blacklist. Ini karena jika
  69. class assert bernilai <code>false</code> (IP masuk daftar blacklist) maka aturan jadi tidak berlaku,
  70. yang artinya semua akses ditolak.
  71. Mesti anda fahami, ini adalah kasus spesial. Karena kita memberi nilai <code>null</code> pada parameter masukan
  72. (ingat kembali sifat Zend_Acl di <link linkend="zend.acl.introduction">sub bab sebelumnya</link>
  73. yang default-nya menolak semua role untuk mengakses semua resource).
  74. Namun jika anda menetapkan aturan tertentu pada role, resource dan/atau hak akses tertentu, maka class assert yang
  75. bernilai <code>false</code> hanya akan membuat aturan itu saja yang tidak berlaku, sementara aturan lain
  76. yang mungkin ada tetap berlaku.
  77. </para>
  78. <para>
  79. Perhatikan di method <code>assert()</code> dari objek assertion di atas. ACL, role, resource dan
  80. hak akses (privilege) digunakan sebagai parameter masukannya. Ini memungkinkan anda untuk
  81. menentukan bilamana class assertion yang anda buat diberlakukan terhadap ACL, role, resource
  82. dan hak akses tertentu.
  83. </para>
  84. </sect2>
  85. </sect1>
  86. <!--
  87. vim:se ts=4 sw=4 et:
  88. -->