Zend_Acl-Refining.xml 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 24249 -->
  4. <sect1 id="zend.acl.refining">
  5. <title>アクセス制御の洗練</title>
  6. <sect2 id="zend.acl.refining.precise">
  7. <title>的確なアクセス制御</title>
  8. <para>
  9. <link linkend="zend.acl.introduction">先ほどの節</link>で定義した基本的な <acronym>ACL</acronym>
  10. では、さまざまな規則を <acronym>ACL</acronym> 全体 (すべてのリソース) に対して適用しました。
  11. しかし実際には、アクセス制御にはさまざまな例外がつきものですし、
  12. もっと複雑なものになるでしょう。
  13. <classname>Zend_Acl</classname> では、このような目的のためにも直感的で柔軟な方法で対応できます。
  14. </para>
  15. <para>
  16. 例にあげた <acronym>CMS</acronym> では大半のユーザを 'staff' グループでまとめて管理していました。
  17. ここでは新しく 'marketing' グループを作成し、<acronym>CMS</acronym>
  18. のニュースレターや最新ニュースへのアクセスを許可させる必要があるでしょう。
  19. このグループには、ニュースレターや最新ニュースの公開や保存権限があれば十分でしょう。
  20. </para>
  21. <para>
  22. さらに 'staff' グループに対しては、ニュースの内容は閲覧できますが
  23. 最新ニュースの改変はできないようにします。
  24. 最後に、(administrators を含む) 全員は 'お知らせ'
  25. を保存できないようにします。これは、1 日から 2 日程度の有効期限しか持たないものだからです。
  26. </para>
  27. <para>
  28. まず、ロールレジストリを変更してこれらの変更を反映させます。
  29. 'marketing' グループを作成して 'staff' と同様の基本権限を持たせることにしたので、
  30. 'marketing' を作成し、'staff' の権限を継承させます。
  31. </para>
  32. <programlisting language="php"><![CDATA[
  33. // 新しいグループ marketing は staff の権限を引き継ぎます
  34. $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
  35. ]]></programlisting>
  36. <para>
  37. 次に、これらのアクセス制御は特定のリソース
  38. (例: "newsletter"、"latest news"、"announcement news")
  39. に限定されることに注目しましょう。ここで、これらのリソースを追加します。
  40. </para>
  41. <programlisting language="php"><![CDATA[
  42. // 規則を適用するリソースを作成します
  43. // ニュースレター
  44. $acl->addResource(new Zend_Acl_Resource('newsletter'));
  45. // ニュース
  46. $acl->addResource(new Zend_Acl_Resource('news'));
  47. // 最新ニュース
  48. $acl->addResource(new Zend_Acl_Resource('latest'), 'news');
  49. // お知らせ
  50. $acl->addResource(new Zend_Acl_Resource('announcement'), 'news');
  51. ]]></programlisting>
  52. <para>
  53. そして、次のような特別な規則を、<acronym>ACL</acronym> の該当範囲に適用します。
  54. </para>
  55. <programlisting language="php"><![CDATA[
  56. // Marketing は、ニュースレターおよび最新ニュースを公開、保存できなければなりません
  57. $acl->allow('marketing',
  58. array('newsletter', 'latest'),
  59. array('publish', 'archive'));
  60. // Staff (そして継承による marketing) は最新ニュースの改変ができません
  61. $acl->deny('staff', 'latest', 'revise');
  62. // 全員 (administrators を含む) はお知らせを保存することができません
  63. $acl->deny(null, 'announcement', 'archive');
  64. ]]></programlisting>
  65. <para>
  66. これで、最新の変更内容を反映した <acronym>ACL</acronym> への問い合わせが行えるようになります。
  67. </para>
  68. <programlisting language="php"><![CDATA[
  69. echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
  70. "allowed" : "denied";
  71. // denied となります
  72. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  73. "allowed" : "denied";
  74. // allowed となります
  75. echo $acl->isAllowed('staff', 'latest', 'publish') ?
  76. "allowed" : "denied";
  77. // denied となります
  78. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  79. "allowed" : "denied";
  80. // allowed となります
  81. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  82. "allowed" : "denied";
  83. // allowed となります
  84. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  85. "allowed" : "denied";
  86. // denied となります
  87. echo $acl->isAllowed('editor', 'announcement', 'archive') ?
  88. "allowed" : "denied";
  89. // denied となります
  90. echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
  91. "allowed" : "denied";
  92. // denied となります
  93. ]]></programlisting>
  94. </sect2>
  95. <sect2 id="zend.acl.refining.removing">
  96. <title>アクセス制御の削除</title>
  97. <para>
  98. <acronym>ACL</acronym> からひとつあるいは複数のアクセス規則を削除するには、
  99. <methodname>removeAllow()</methodname> メソッドあるいは <methodname>removeDeny()</methodname>
  100. メソッドを使用します。<methodname>allow()</methodname> および <methodname>deny()</methodname>
  101. と同様、<constant>NULL</constant> 値を指定すると
  102. すべてのロールやリソース、権限を表すことになります。
  103. </para>
  104. <programlisting language="php"><![CDATA[
  105. // 最新ニュースの改変拒否を staff (そして継承による marketing) から削除します
  106. $acl->removeDeny('staff', 'latest', 'revise');
  107. echo $acl->isAllowed('marketing', 'latest', 'revise') ?
  108. "allowed" : "denied";
  109. // allowed となります
  110. // ニュースレターの公開や保存の権限を、marketing から取り除きます
  111. $acl->removeAllow('marketing',
  112. 'newsletter',
  113. array('publish', 'archive'));
  114. echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
  115. "allowed" : "denied";
  116. // denied となります
  117. echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
  118. "allowed" : "denied";
  119. // denied となります
  120. ]]></programlisting>
  121. <para>
  122. 上で説明したように、徐々に権限を変更していくこともできますが、
  123. 権限に対して <constant>NULL</constant> 値を設定すると、
  124. このような変更を一括で行うことができます。
  125. </para>
  126. <programlisting language="php"><![CDATA[
  127. // marketing に対して、最新のニュースへのアクセスを許可します
  128. $acl->allow('marketing', 'latest');
  129. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
  130. "allowed" : "denied";
  131. // allowed となります
  132. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
  133. "allowed" : "denied";
  134. // allowed となります
  135. echo $acl->isAllowed('marketing', 'latest', 'anything') ?
  136. "allowed" : "denied";
  137. // allowed となります
  138. ]]></programlisting>
  139. </sect2>
  140. </sect1>
  141. <!--
  142. vim:se ts=4 sw=4 et:
  143. -->