Zend_Acl.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. <sect1 id="zend.acl.introduction">
  2. <title>Pengenalan</title>
  3. <para>
  4. Zend_Acl menyediakan implementasi access control list (ACL) untuk manajemen hak akses (privilege).
  5. Secara umum, sebuah aplikasi dapat menggunakan ACL untuk mengontrol akses terhadap objek-objek
  6. yang terproteksi oleh objek yang lain.
  7. </para>
  8. <para>
  9. Untuk keperluan dokumentasi ini, berikut istilah-istilah yang perlu anda ketahui,
  10. <itemizedlist>
  11. <listitem>
  12. <para>
  13. <emphasis role="strong">resource</emphasis> adalah sebuah objek
  14. yang dikontrol akses terhadapnya.
  15. </para>
  16. </listitem>
  17. <listitem>
  18. <para>
  19. <emphasis role="strong">role</emphasis> adalah sebuah objek
  20. yang meminta akses ke resource.
  21. </para>
  22. </listitem>
  23. </itemizedlist>
  24. Dengan kalimat sederhana, <emphasis role="strong">role adalah objek yang meminta akses ke resource tertentu</emphasis>.
  25. Sebagai ilustrasi, jika pengguna parkir meminta akses ke sebuah mobil, maka pengguna parkir tersebut
  26. adalah role, sementara mobil adalah resource, karena hak akses ke mobil tertentu tidak dimiliki semua orang.
  27. </para>
  28. <para>
  29. Dengan spesifikasi dan penggunaan ACL, sebuah aplikasi dapat mengontrol
  30. bagaimana role diberikan hak untuk mengakses resource tertentu.
  31. </para>
  32. <sect2 id="zend.acl.introduction.resources">
  33. <title>Tentang Resource</title>
  34. <para>
  35. Membuat sebuah resource di Zend_Acl sangat mudah. Zend_Acl menyediakan interface
  36. <code>Zend_Acl_Resource_Interface</code> untuk memfasilitasi pembuatan resource dalam sebuah aplikasi.
  37. Sebuah class hanya perlu mengimplementasikan interface ini, yang terdiri dari hanya sebuah method,
  38. <code>getResourceId()</code>, dan Zend_Acl akan mengenali objek tersebut sebagai sebuah resource.
  39. Zend_Acl juga menyediakan <code>Zend_Acl_Resource</code> sebagai implementasi
  40. dasar dari <code>Zend_Acl_Resource_Interface</code>, sehingga developer cukup meng-extend class
  41. ini sesuai kebutuhan.
  42. </para>
  43. <para>
  44. Zend_Acl menyediakan struktur pohon untuk menyimpan resource-resource.
  45. Karena struktur pohon ini, tiap resource dapat diorganisasikan mulai dari
  46. yang umum (akar) sampai ke yang lebih spesifik (daun). Query pada resource tertentu
  47. secara otomatis akan mencari aturan-aturan di hirarki resource mulai dari resource
  48. teratas (ancestor), sehingga dimungkinkan untuk mewariskan aturan
  49. ke bawahnya dengan lebih mudah.
  50. Sebagai ilustrasi, jika sebuah role defaultnya diterapkan pada seluruh bangunan di sebuah kota,
  51. maka akan lebih mudah jika role itu diterapkan terhadap satu kota, bukannya terhadap tiap bangunan
  52. di dalam kota tersebut. Kalaupun misalnya beberapa bangunan perlu pengecualian, Zend_Acl cukup
  53. menetapkan pengecualian itu saja ke beberapa gedung. Sebuah resource dapat mewarisi dari
  54. satu resource yang jadi parent-nya, sementara resource yang jadi parent ini bisa mewarisi
  55. dari resource di atasnya, dan seterusnya.
  56. </para>
  57. <para>
  58. Zend_Acl juga mendukung hak akses istimewa (privilege) pada resource (mis: "create", "read", "update", "delete"),
  59. sehingga developer dapat menetapkan aturan yang bisa mempengaruhi seluruh privilege atau sebagian privilege
  60. saja pada satu atau lebih resource.
  61. </para>
  62. </sect2>
  63. <sect2 id="zend.acl.introduction.roles">
  64. <title>Tentang Role</title>
  65. <para>
  66. Sebagaimana resource, membuat sebuah role juga sangat mudah. Semua role mesti mengimplementasikan
  67. <code>Zend_Acl_Role_Interface</code>. Interface ini berisi sebuah method, <code>getRoleId()</code>.
  68. Zend_Acl juga menyediakan <code>Zend_Acl_Role</code> sebagai implementasi dasar dari
  69. <code>Zend_Acl_Role_Interface</code>, sehingga developer cukup meng-extend class
  70. ini sesuai kebutuhan.
  71. </para>
  72. <para>
  73. Dalam Zend_Acl, sebuah role dapat mewarisi aturan dari satu atau lebih role di atasnya (parent).
  74. Sebagai ilustrasi, sebuah role user dengan nama "sally", mungkin milik dari satu atau lebih role
  75. yang lain yang jadi parent-nya, seperti "editor" dan "administrator" misalnya.
  76. Developer dapat menetapkan aturan yang berbeda untuk "editor" dan "administrator", dan "sally"
  77. akan mewarisi aturan tersebut dari keduanya, tanpa harus menetapkan aturan langsung ke "sally".
  78. </para>
  79. <para>
  80. Biarpun kemampuan mewariskan aturan antar role ini sangat berguna, namun terkdang pewarisan
  81. berlipat (multiple inheritance) ini dapat menimbulkan kompleksitas yang tinggi.
  82. Contoh berikut memberi ilustrasi masalah pewarisan yang
  83. menimbulkan kondisi ambiguitas dan bagaimana Zend_Acl memecahkannya.
  84. </para>
  85. <example id="zend.acl.introduction.roles.example.multiple_inheritance">
  86. <title>Multiple Inheritance di antara Role</title>
  87. <para>
  88. Kode berikut mendefinisikan tiga role dasar - "<code>guest</code>", "<code>member</code>", dan
  89. "<code>admin</code>". Kemudian role dengan nama
  90. "<code>someUser</code>" dibuat dan mewarisi ketiga role tadi. Hati-hati, urutan dimana ketiga role
  91. parent itu terlihat di array <code>$parents</code> sangat penting.
  92. Ketika dibutuhkan, Zend_Acl akan mencari aturan akses bukan hanya pada role yang di-query
  93. (dalam hal ini "<code>someUser</code>"), tapi juga pada role yang mewarisinya (dalam hal ini
  94. "<code>guest</code>", "<code>member</code>", dan "<code>admin</code>"):
  95. </para>
  96. <programlisting role="php"><![CDATA[
  97. $acl = new Zend_Acl();
  98. $acl->addRole(new Zend_Acl_Role('guest'))
  99. ->addRole(new Zend_Acl_Role('member'))
  100. ->addRole(new Zend_Acl_Role('admin'));
  101. $parents = array('guest', 'member', 'admin');
  102. $acl->addRole(new Zend_Acl_Role('someUser'), $parents);
  103. $acl->add(new Zend_Acl_Resource('someResource'));
  104. $acl->deny('guest', 'someResource');
  105. $acl->allow('member', 'someResource');
  106. echo $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
  107. ]]>
  108. </programlisting>
  109. <para>
  110. Karena tidak ada aturan spesifik yang didefinisikan untuk role "<code>someUser</code>" terhadap
  111. "<code>someResource</code>", Zend_Acl kemudian mencari aturan yang mungkin didefinisikan
  112. oleh parent dari "<code>someUser</code>". Pertama, Zend_Acl mengunjungi "<code>admin</code>",
  113. dan ternyata tidak ada aturan untuk resource "<code>someResource</code>" di sini. Selanjutnya,
  114. Zend_Acl menuju "<code>member</code>", dan Zend_Acl menemukan ada aturan di situ yang menyatakan bahwa
  115. role "<code>member</code>" diperbolehkan mengakses "<code>someResource</code>".
  116. </para>
  117. <para>
  118. Kalau saja Zend_Acl meneruskan pencariannya ke parent yang lain ("<code>guest</code>"), maka akan
  119. ditemui bahwa "<code>guest</code>" tidak boleh mengakses "<code>someResource</code>". Ini menimbulkan
  120. ambiguitas, karena satu role ("<code>someUser</code>") jadi memiliki dua aturan akses yang berlawanan,
  121. yaitu "allowed" dan "denied".
  122. </para>
  123. <para>
  124. Zend_Acl memecahkan ambiguitas ini dengan menghentikan pencarian ketika sudah ditemukan
  125. role yang memiliki aturan akses yang ia cari. Dalam kasus ini, karena role "<code>member</code>"
  126. diperiksa sebelum role "<code>guest</code>", contoh di atas akan mencetak keluaran "<code>allowed</code>".
  127. </para>
  128. </example>
  129. <note>
  130. <para>
  131. Ketika anda menetapkan dua role atau lebih sebagai parent dari sebuah role, mesti diingat bahwa
  132. parent yang terakhir dalam daftar pencarian adalah yang pertama kali ditanya apakah ada aturan
  133. akses untuk resource yang diminta.
  134. </para>
  135. </note>
  136. </sect2>
  137. <sect2 id="zend.acl.introduction.creating">
  138. <title>Membuat Access Control List (ACL)</title>
  139. <para>
  140. Sebuah ACL dapat merepresentasikan objek apa saja, baik fisik maupun virtual.
  141. Namun sebagai demonstrasi, kita akan coba membuat ACL untuk Content Management System (CMS) yang
  142. mengatur hak akses beberapa pihak terhadap area tertentu. Untuk membuat objek ACL, kita cukup
  143. inisialisasi ACL dengan tanpa parameter seperti berikut:
  144. </para>
  145. <programlisting role="php"><![CDATA[
  146. $acl = new Zend_Acl();
  147. ]]>
  148. </programlisting>
  149. <note>
  150. <para>
  151. Sampai developer menambahkan aturan "allow", Zend_Acl akan menolak ("denied") akses untuk
  152. setiap privilege dari tiap resource oleh setiap role.
  153. </para>
  154. </note>
  155. </sect2>
  156. <sect2 id="zend.acl.introduction.role_registry">
  157. <title>Mendaftarkan Role</title>
  158. <para>
  159. CMS hampir selalu membutuhkan hirarki perizinan yang menentukan kemampuan user untuk menambah, mengubah atau
  160. menghapus content. Umumnya CMS memiliki group 'Guest' yang hanya bisa mengakses demo, group
  161. 'Staff' yang melakukan administrasi harian, group 'Editor' yang bertanggungjawab untuk mem-publish,
  162. mereview, mengarsip dan menghapus isi tulisan, dan terakhir ada group 'Administrator' yang tugasnya
  163. mencakup semua tugas group tadi ditambah tugas mengelola informasi-informasi sensitif, manajemen user,
  164. konfigurasi back-end dan export/backup data.
  165. Seluruh perizinan ini dapat direpresentasikan dalam sebuah role registry, yang memungkinkan
  166. tiap group mewarisi hak akses dari group 'parent', sekaligus menyediakan hak akses tertentu
  167. bagi group mereka sendiri. Perizinan ini dapat diekspresikan sebagai berikut:
  168. </para>
  169. <table id="zend.acl.introduction.role_registry.table.example_cms_access_controls">
  170. <title>Access Control untuk Contoh CMS</title>
  171. <tgroup cols="3">
  172. <thead>
  173. <row>
  174. <entry>Nama</entry>
  175. <entry>Hak Akses</entry>
  176. <entry>Mewarisi Hak Akses Dari</entry>
  177. </row>
  178. </thead>
  179. <tbody>
  180. <row>
  181. <entry>Guest</entry>
  182. <entry>View</entry>
  183. <entry>N/A</entry>
  184. </row>
  185. <row>
  186. <entry>Staff</entry>
  187. <entry>Edit, Submit, Revise</entry>
  188. <entry>Guest</entry>
  189. </row>
  190. <row>
  191. <entry>Editor</entry>
  192. <entry>Publish, Archive, Delete</entry>
  193. <entry>Staff</entry>
  194. </row>
  195. <row>
  196. <entry>Administrator</entry>
  197. <entry>(bisa akses semuanya)</entry>
  198. <entry>N/A</entry>
  199. </row>
  200. </tbody>
  201. </tgroup>
  202. </table>
  203. <para>
  204. Untuk contoh kasus ini kita akan menggunakan <code>Zend_Acl_Role</code>, walaupun sembarang objek
  205. yang mengimplementasikan <code>Zend_Acl_Role_Interface</code> bisa digunakan. Group-group ini
  206. dapat ditambahkan ke role registry dengan cara berikut:
  207. </para>
  208. <programlisting role="php"><![CDATA[
  209. $acl = new Zend_Acl();
  210. // Menambahkan group ke Role registry menggunakan Zend_Acl_Role
  211. // Guest tidak mewarisi hak akses dari group lain
  212. $roleGuest = new Zend_Acl_Role('guest');
  213. $acl->addRole($roleGuest);
  214. // Staff mewarisi hak akses dari guest
  215. $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
  216. /*
  217. Alternatif lain untuk kode di atas adalah seperti berikut:
  218. $acl->addRole(new Zend_Acl_Role('staff'), 'guest');
  219. */
  220. // Editor mewarisi hak akses dari staff
  221. $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
  222. // Administrator tidak mewarisi hak akses dari group lain
  223. $acl->addRole(new Zend_Acl_Role('administrator'));
  224. ]]>
  225. </programlisting>
  226. </sect2>
  227. <sect2 id="zend.acl.introduction.defining">
  228. <title>Mendefinisikan Access Control</title>
  229. <para>
  230. Sekarang di dalam ACL sudah ada role-role, berikutnya kita dapat menentukan bagaimana aturan akses tiap role
  231. tersebut ke resource. Kalau anda perhatikan, kita belum mendefinsikan satupun resource
  232. dalam contoh kasus ini. Yang sederhananya ini berarti semua aturan berlaku untuk semua resource, apapun itu.
  233. Ini karena Zend_Acl menerapkan aturan akses dari yang umum ke yang lebih spesifik
  234. dengan tujuan untuk meminimasi jumlah aturan yang mesti dibuat. Ini dimungkinkan karena resource dan role mewarisi
  235. aturan yang didefinisikan di pendahulu-pendahulu mereka sebelumnya.
  236. </para>
  237. <note>
  238. <para>
  239. Secara umum, Zend_Acl mematuhi aturan tertentu jika dan hanya jika tidak ada aturan lain
  240. yang lebih spesifik.
  241. </para>
  242. </note>
  243. <para>
  244. Sebagai konsekuensi hal ini, kita dapat mendefinisikan seperangkat aturan yang kompleks dengan
  245. kode yang minimal. Untuk contoh kasus kita di atas, berikut adalah kode untuk menerapkan aturan aksesnya:
  246. </para>
  247. <programlisting role="php"><![CDATA[
  248. $acl = new Zend_Acl();
  249. $roleGuest = new Zend_Acl_Role('guest');
  250. $acl->addRole($roleGuest);
  251. $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
  252. $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
  253. $acl->addRole(new Zend_Acl_Role('administrator'));
  254. // Guest hanya boleh melihat (view) content
  255. $acl->allow($roleGuest, null, 'view');
  256. /*
  257. Kode di atas bisa juga ditulis:
  258. $acl->allow('guest', null, 'view');
  259. //*/
  260. // Staff mewarisi hak akses view dari guest, tapi juga perlu tambahan izin revise
  261. $acl->allow('staff', null, array('edit', 'submit', 'revise'));
  262. // Editor mewarisi izin view, edit, submit, dan revise dari
  263. // staff, tapi juga perlu tambahan izin delete
  264. $acl->allow('editor', null, array('publish', 'archive', 'delete'));
  265. // Administrator tidak mewarisi apa-apa, tapi memiliki semua hak akses
  266. $acl->allow('administrator');
  267. ]]>
  268. </programlisting>
  269. <para>
  270. Nilai <code>null</code> dalam method <code>allow()</code> di atas digunakan untuk
  271. mengindikasikan kalau aturan bersangkutan berlaku untuk semua resource.
  272. </para>
  273. </sect2>
  274. <sect2 id="zend.acl.introduction.querying">
  275. <title>Mengambil (Query) Aturan ACL</title>
  276. <para>
  277. Sekarang kita sudah memiliki ACL yang fleksibel yang dapat digunakan untuk menentukan apakah
  278. pemohon memiliki akses untuk melakukan fungsi tertentu dalam sebuah aplikasi web.
  279. Untuk mengambil (query) aturan ACL yang telah ditetapkan sebelumnya cukup dengan menggunakan
  280. method <code>isAllowed()</code> seperti berikut:
  281. </para>
  282. <programlisting role="php"><![CDATA[
  283. echo $acl->isAllowed('guest', null, 'view') ?
  284. "allowed" : "denied";
  285. // allowed
  286. echo $acl->isAllowed('staff', null, 'publish') ?
  287. "allowed" : "denied";
  288. // denied
  289. echo $acl->isAllowed('staff', null, 'revise') ?
  290. "allowed" : "denied";
  291. // allowed
  292. echo $acl->isAllowed('editor', null, 'view') ?
  293. "allowed" : "denied";
  294. // allowed karena mewarisinya dari guest
  295. echo $acl->isAllowed('editor', null, 'update') ?
  296. "allowed" : "denied";
  297. // denied karena tidak ada aturan allow untuk 'update'
  298. echo $acl->isAllowed('administrator', null, 'view') ?
  299. "allowed" : "denied";
  300. // allowed karena administrator diperbolehkan mengakses apapun
  301. echo $acl->isAllowed('administrator') ?
  302. "allowed" : "denied";
  303. // allowed karena administrator diperbolehkan mengakses apapun
  304. echo $acl->isAllowed('administrator', null, 'update') ?
  305. "allowed" : "denied";
  306. // allowed karena administrator diperbolehkan mengakses apapun
  307. ]]>
  308. </programlisting>
  309. </sect2>
  310. </sect1>
  311. <!--
  312. vim:se ts=4 sw=4 et:
  313. -->