Zend_Acl-Refining.xml 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <sect1 id="zend.acl.refining">
  2. <title>Kontrol Akses Yang Lebih Detail</title>
  3. <sect2 id="zend.acl.refining.precise">
  4. <title>Kontrol Akses Yang Presisi</title>
  5. <para>
  6. Dasar-dasar ACL yang dijelaskan dalam <link linkend="zend.acl.introduction">sub bab sebelumnya</link>
  7. memperlihatkan bagaimana berbagai hak akses diterapkan terhadap seluruh ACL (semua resource).
  8. Namun dalam prakteknya, kontrol akses sering kali memiliki pengecualian-pengecualian dan beragam
  9. tingkat kompleksitas. Zend_Acl memungkinkan anda mengantisipasi hal-hal detail seperti ini dalam langkah jelas
  10. dan fleksibel.
  11. </para>
  12. <para>
  13. Sebagai contoh, dalam kasus CMS kita sebelumnya, role 'staff' memiliki hak akses yang mencakup semua
  14. kebutuhan user. Hanya saja, terkadang kita memerlukan group di bawah 'staff' yang bernama 'marketing'
  15. yang hanya bisa mengakses "newsletter" dan berita terakhir ("latest news") di CMS.
  16. </para>
  17. <para>
  18. Juga diinginkan agar 'staff' hanya dapat melihat ("view") berita ("news") tapi tidak
  19. boleh mengedit berita terakhir. Dan terakhir, semua orang (termasuk administrator) mesti tidak bisa membuat arsip
  20. dari tiap berita pengumumuman ("anountcement news") karena biasanya pengumuman seperti ini cuma berlaku 1-2 hari.
  21. </para>
  22. <para>
  23. Pertama, kita perlu merevisi role registry untuk mangakomodir kebutuhan baru ini. Seperti sudah dijelaskan,
  24. group 'marketing' memiliki perizinan yang sama dengan 'staff', sehingga kita cukup mendefinisikan 'marketing'
  25. dengan mewarisi perizinan dari 'staff':
  26. </para>
  27. <programlisting role="php"><![CDATA[
  28. // Group baru bernama marketing yang mewarisi perizinan staff
  29. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  30. ]]>
  31. </programlisting>
  32. <para>
  33. Berikutnya, kita memerlukan tiga buah resource yaitu "newsletter", "latest news", dan "announcement news":
  34. </para>
  35. <programlisting role="php"><![CDATA[
  36. // membuat resource
  37. // newsletter
  38. $acl->add(new Zend_Acl_Resource('newsletter'));
  39. // news
  40. $acl->add(new Zend_Acl_Resource('news'));
  41. // latest news yang merupakan anak dari news
  42. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  43. // announcement news yang merupakan anak dari news
  44. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  45. ]]>
  46. </programlisting>
  47. <para>
  48. Selanjutnya tinggal mendifinisikan aturan-aturan spesifik sesuai kebutuhan di atas ke dalam ACL:
  49. </para>
  50. <programlisting role="php"><![CDATA[
  51. // Marketing bisa mempublish and mengarsip (archive) newsletter dan
  52. // berita terakhir
  53. $acl->allow('marketing',
  54. array('newsletter', 'latest'),
  55. array('publish', 'archive'));
  56. // Staff (dan juga marketing, sesuai pewarisan), tidak boleh
  57. // merevisi berita terakhir
  58. $acl->deny('staff', 'latest', 'revise');
  59. // Semua (termasuk administrator) tidak boleh
  60. // mengarsip berita pengumuman
  61. $acl->deny(null, 'announcement', 'archive');
  62. ]]>
  63. </programlisting>
  64. <para>
  65. Dari aturan baru yang sudah kita buat, kita bisa melakukan query seperti berikut:
  66. </para>
  67. <programlisting role="php"><![CDATA[
  68. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  69. "allowed" : "denied";
  70. // denied
  71. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  72. "allowed" : "denied";
  73. // allowed
  74. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  75. "allowed" : "denied";
  76. // denied
  77. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  78. "allowed" : "denied";
  79. // allowed
  80. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  81. "allowed" : "denied";
  82. // allowed
  83. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  84. "allowed" : "denied";
  85. // denied
  86. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  87. "allowed" : "denied";
  88. // denied
  89. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  90. "allowed" : "denied";
  91. // denied
  92. ]]>
  93. </programlisting>
  94. </sect2>
  95. <sect2 id="zend.acl.refining.removing">
  96. <title>Menghapus Aturan dari Kontrol Akses</title>
  97. <para>
  98. Untuk menghapus satu atau lebih aturan dari ACL, anda cukup menggunakan method <code>removeAllow()</code>
  99. atau <code>removeDeny()</code>. Seperti halnya <code>allow()</code> dan <code>deny()</code>, anda
  100. bisa menambahkan nilai <code>null</code> untuk mengindikasikan penghapusan aturan itu berlaku terhadap semua role,
  101. resource dan atau hak akses:
  102. </para>
  103. <programlisting role="php"><![CDATA[
  104. // Membuat staff (dan juga marketing karena pewarisan) menjadi
  105. // bisa merevisi berita terakhir
  106. $acl->removeDeny('staff', 'latest', 'revise');
  107. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  108. "allowed" : "denied";
  109. // allowed
  110. // Menghapus hak untuk mempublish dan mengarsip (archive) newsletter
  111. // dari marketing
  112. $acl->removeAllow('marketing',
  113. 'newsletter',
  114. array('publish', 'archive'));
  115. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  116. "allowed" : "denied";
  117. // denied
  118. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  119. "allowed" : "denied";
  120. // denied
  121. ]]>
  122. </programlisting>
  123. <para>
  124. Hak akses dapat dimodifikasi secara spesifik untuk aksi tertentu (publish, archive)
  125. seperti ditunjukan di atas, tapi nilai <code>null</code> pada hak akses akan menimpah
  126. modifikasi semacam itu:
  127. </para>
  128. <programlisting role="php"><![CDATA[
  129. // kembali memperbolehkan marketing melakukan apapun terhadap
  130. // berita terakhir. Perhatikan kita tidak memasukan parameter terakhir pada allow()
  131. // yang berarti null, dan berarti ini berlaku untuk aksi apapun (publish, archive dll)
  132. $acl->allow('marketing', 'latest');
  133. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  134. "allowed" : "denied";
  135. // allowed
  136. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  137. "allowed" : "denied";
  138. // allowed
  139. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  140. "allowed" : "denied";
  141. // allowed
  142. ]]>
  143. </programlisting>
  144. </sect2>
  145. </sect1>
  146. <!--
  147. vim:se ts=4 sw=4 et:
  148. -->