Zend_Acl-Refining.xml 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <sect1 id="zend.acl.refining">
  2. <title>精细的访问控制</title>
  3. <sect2 id="zend.acl.refining.precise">
  4. <title>精细的访问控制</title>
  5. <para>
  6. 在<link linkend="zend.acl.introduction">前一章节</link>中定义的基本的 ACL 显示如何在整个 ACL (所有的 resources )允许各种各样的权限。然而在实践中,访问控制趋向于拥有例外和可变程度的复杂性。Zend_Acl 允许你直截了当并灵活地完成这些精细准确的控制。
  7. </para>
  8. <para>
  9. 对于CMS范例,'staff' 组覆盖了绝大多数用户的需求,同时,一个新的 'marketing' 组要求在CMS中访问时事通讯和最近的新闻。这个组相当地自给自足并有能力发布和归档时事通讯和最近的新闻。
  10. </para>
  11. <para>
  12. 另外,还要求 'staff' 组被允许浏览新闻故事但不能修订最近的新闻。最后,不可能让每一个人(包括系统管理员)去归档任何'announcement' 新闻故事,因为它们只有1-2天的生命周期。
  13. </para>
  14. <para>
  15. 首先我们修订 role 注册表来反映这些变化。我们已经确定 'marketing' 组和 'staff' 组有着同样的基本许可,所以我们用从 'staff' 组继承许可的方法来定义 'marketing' 组
  16. </para>
  17. <programlisting role="php"><![CDATA[
  18. // 新 marketing 组从 staff 组继承许可
  19. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  20. ]]>
  21. </programlisting>
  22. <para>
  23. 然后, 注意上面的访问控制涉及到特定的 resources ( 例如 "newsletter", "latest news", "announcement news"). 现在我们来添加这些 resources:
  24. </para>
  25. <programlisting role="php"><![CDATA[
  26. // Create Resources for the rules
  27. // newsletter
  28. $acl->add(new Zend_Acl_Resource('newsletter'));
  29. // news
  30. $acl->add(new Zend_Acl_Resource('news'));
  31. // latest news
  32. $acl->add(new Zend_Acl_Resource('latest'), 'news');
  33. // announcement news
  34. $acl->add(new Zend_Acl_Resource('announcement'), 'news');
  35. ]]>
  36. </programlisting>
  37. <para>
  38. 接着,这个是在 ACL 的目标区域定义更特定的规则的概况:
  39. </para>
  40. <programlisting role="php"><![CDATA[
  41. // Marketing must be able to publish and archive newsletters and the
  42. // latest news
  43. $acl->allow('marketing',
  44. array('newsletter', 'latest'),
  45. array('publish', 'archive'));
  46. // Staff (和 marketing, 通过继承), 禁止修订 latest news
  47. $acl->deny('staff', 'latest', 'revise');
  48. // Everyone (包括 administrators) 禁止归档 news announcements
  49. $acl->deny(null, 'announcement', 'archive');
  50. ]]>
  51. </programlisting>
  52. <para>
  53. 我们现在能够查询到 ACL 的最新变化:
  54. </para>
  55. <programlisting role="php"><![CDATA[
  56. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  57. "allowed" : "denied";
  58. // denied
  59. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  60. "allowed" : "denied";
  61. // allowed
  62. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  63. "allowed" : "denied";
  64. // denied
  65. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  66. "allowed" : "denied";
  67. // allowed
  68. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  69. "allowed" : "denied";
  70. // allowed
  71. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  72. "allowed" : "denied";
  73. // denied
  74. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  75. "allowed" : "denied";
  76. // denied
  77. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  78. "allowed" : "denied";
  79. // denied
  80. ]]>
  81. </programlisting>
  82. </sect2>
  83. <sect2 id="zend.acl.refining.removing">
  84. <title>除去访问控制</title>
  85. <para>
  86. 要从 ACL 中除去一个或多个访问规则,只要简单地用 <code>removeAllow()</code> 或 <code>removeDeny()</code> 方法即可。如果提供一个<code>null</code>参数值给 <code>allow()</code> 和 <code>deny()</code> 方法,则访问规则将应用到所有的角色,资源和/或权限上。
  87. </para>
  88. <programlisting role="php"><![CDATA[
  89. // 除去 “禁止 staff 修订最近的新闻”(和marketing, 由于继承的原因)
  90. //(等于允许staff修订最近的新闻 Jason注)
  91. $acl->removeDeny('staff', 'latest', 'revise');
  92. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  93. "allowed" : "denied";
  94. // allowed
  95. // Remove the allowance of publishing and archiving newsletters to
  96. // marketing
  97. $acl->removeAllow('marketing',
  98. 'newsletter',
  99. array('publish', 'archive'));
  100. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  101. "allowed" : "denied";
  102. // denied
  103. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  104. "allowed" : "denied";
  105. // denied
  106. ]]>
  107. </programlisting>
  108. <para>
  109. 如上所示,对于权限的修改可能是增量的,但使用 <code>null</code> 值(未指定权限项的参数值)超越了对权限的增量修改。(所谓的增量修改是指可以对 Resources 一个一个地添加权限或禁止,而如果未指定权限参数值,即使用 <code>null</code> 值,可以使得这些步骤简化,一次性地对某个Resource的所有权限进行允许或禁止。Jason注,Haohappy补)
  110. </para>
  111. <programlisting role="php"><![CDATA[
  112. // 允许 marketing 对 latest news 有所有的许可
  113. $acl->allow('marketing', 'latest');
  114. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  115. "allowed" : "denied";
  116. // allowed
  117. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  118. "allowed" : "denied";
  119. // allowed
  120. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  121. "allowed" : "denied";
  122. // allowed
  123. ]]>
  124. </programlisting>
  125. </sect2>
  126. </sect1>
  127. <!--
  128. vim:se ts=4 sw=4 et:
  129. -->