| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <sect1 id="zend.acl.advanced">
- <title>Penggunaan Tingkat Lanjut</title>
- <sect2 id="zend.acl.advanced.storing">
- <title>Menyimpan data ACL</title>
- <para>
- Zend_Acl didesain sedemikian rupa sehingga ia tidak bergantung pada teknologi backend seperti database
- atau server cache untuk menyimpan data ACL. Zend_Acl sepenuhnya diimplementasikan dalam kode PHP
- sehingga perangkat administrasi lainnya (seperti penyimpanan data ACL) dapat dibangun di atasnya
- dengan relatif mudah dan fleksibel. Sebab terkadang kita perlu mengelola ACL ini secara interaktif,
- tidak persistence seperti halnya kalau kita menyimpan dalam database. Untuk itu Zend_Acl menyediakan
- method untuk melakukan setup dan query ACL dari aplikasi secara dinamis.
- </para>
- <para>
- Dengan kata lain, penyimpanan data ACL diserahkan sepenuhnya kepada developer, karena penggunaan tempat
- penyimpanan data ACL sangat beragam dan berbeda untuk tiap aplikasi. Yang jelas, objek Zend_Acl
- dapat diserialisasikan, dan dengan menggunakan fungsi
- <ulink url="http://php.net/serialize"><code>serialize()</code></ulink> di PHP, anda dapat menyimpan
- hasil keluarannya ke tempat penyimpanan sesuai keinginan anda. Bisa ke dalam file, database atau
- mekanisme caching.
- </para>
- </sect2>
- <sect2 id="zend.acl.advanced.assertions">
- <title>Aturan Kondisional ACL dengan Assertion</title>
- <para>
- Terkadang aturan ACL untuk memperbolehkan atau melarang akses ke resource tertentu tidak absolut melainkan
- bergantung pada beberapa kondisi. Misalnya sebuah resource bisa diakses oleh role tertentu, tapi hanya
- antara jam 8.00 pagi sampai jam 5.00 sore. Contoh kasus lain adalah resource tertentu tidak bisa diakses oleh
- pengunjung dengan IP tertentu karena sudah ditandai sebagai sumber ancaman. Zend_Acl memiliki dukungan
- built-in untuk mengimplementasikan aturan kondisional seperti ini.
- </para>
- <para>
- Penerapan aturan kondisional seperti ini (atau assertion) dilakukan dengan menggunakan <code>Zend_Acl_Assert_Interface</code>.
- Untuk menggunakan interface ini, developer harus membuat sebuah class terlebih dahulu yang mengimplementasikan
- method <code>assert()</code> dari interface tersebut:
- </para>
- <programlisting role="php"><![CDATA[
- class CleanIPAssertion implements Zend_Acl_Assert_Interface
- {
- public function assert(Zend_Acl $acl,
- Zend_Acl_Role_Interface $role = null,
- Zend_Acl_Resource_Interface $resource = null,
- $privilege = null)
- {
- return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
- }
- // di sini dibuat mekanisme untuk memeriksa apakah $ip
- // tergolong aman dan tidak masuk dalam daftar blacklist
- // keluaran: true jika aman, false jika tidak aman
- protected function _isCleanIP($ip)
- {
- // ...
- }
- }
- ]]>
- </programlisting>
- <para>
- Setelah class assertion ini siap, anda tinggal menambahkan instance class tersebut dalam penentuan
- aturan ACL. Aturan yang disertai class assertion seperti ini hanya berlaku jika class assertion
- mengeluarkan nilai <code>true</code> (benar).
- </para>
- <programlisting role="php"><![CDATA[
- $acl = new Zend_Acl();
- $acl->allow(null, null, null, new CleanIPAssertion());
- ]]>
- </programlisting>
- <para>
- Kode di atas membuat aturan yang memperbolehkan siapapun untuk melakukan apapun
- pada semua resource, kecuali ketika orang tersebut menggunakan IP yang masuk daftar blacklist. Ini karena jika
- class assert bernilai <code>false</code> (IP masuk daftar blacklist) maka aturan jadi tidak berlaku,
- yang artinya semua akses ditolak.
- Mesti anda fahami, ini adalah kasus spesial. Karena kita memberi nilai <code>null</code> pada parameter masukan
- (ingat kembali sifat Zend_Acl di <link linkend="zend.acl.introduction">sub bab sebelumnya</link>
- yang default-nya menolak semua role untuk mengakses semua resource).
- Namun jika anda menetapkan aturan tertentu pada role, resource dan/atau hak akses tertentu, maka class assert yang
- bernilai <code>false</code> hanya akan membuat aturan itu saja yang tidak berlaku, sementara aturan lain
- yang mungkin ada tetap berlaku.
- </para>
- <para>
- Perhatikan di method <code>assert()</code> dari objek assertion di atas. ACL, role, resource dan
- hak akses (privilege) digunakan sebagai parameter masukannya. Ini memungkinkan anda untuk
- menentukan bilamana class assertion yang anda buat diberlakukan terhadap ACL, role, resource
- dan hak akses tertentu.
- </para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|