| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <!-- EN-Revision: 24249 -->
- <sect1 id="zend.acl.refining">
- <title>アクセス制御の洗練</title>
- <sect2 id="zend.acl.refining.precise">
- <title>的確なアクセス制御</title>
- <para>
- <link linkend="zend.acl.introduction">先ほどの節</link>で定義した基本的な <acronym>ACL</acronym>
- では、さまざまな規則を <acronym>ACL</acronym> 全体 (すべてのリソース) に対して適用しました。
- しかし実際には、アクセス制御にはさまざまな例外がつきものですし、
- もっと複雑なものになるでしょう。
- <classname>Zend_Acl</classname> では、このような目的のためにも直感的で柔軟な方法で対応できます。
- </para>
- <para>
- 例にあげた <acronym>CMS</acronym> では大半のユーザを 'staff' グループでまとめて管理していました。
- ここでは新しく 'marketing' グループを作成し、<acronym>CMS</acronym>
- のニュースレターや最新ニュースへのアクセスを許可させる必要があるでしょう。
- このグループには、ニュースレターや最新ニュースの公開や保存権限があれば十分でしょう。
- </para>
- <para>
- さらに 'staff' グループに対しては、ニュースの内容は閲覧できますが
- 最新ニュースの改変はできないようにします。
- 最後に、(administrators を含む) 全員は 'お知らせ'
- を保存できないようにします。これは、1 日から 2 日程度の有効期限しか持たないものだからです。
- </para>
- <para>
- まず、ロールレジストリを変更してこれらの変更を反映させます。
- 'marketing' グループを作成して 'staff' と同様の基本権限を持たせることにしたので、
- 'marketing' を作成し、'staff' の権限を継承させます。
- </para>
- <programlisting language="php"><![CDATA[
- // 新しいグループ marketing は staff の権限を引き継ぎます
- $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
- ]]></programlisting>
- <para>
- 次に、これらのアクセス制御は特定のリソース
- (例: "newsletter"、"latest news"、"announcement news")
- に限定されることに注目しましょう。ここで、これらのリソースを追加します。
- </para>
- <programlisting language="php"><![CDATA[
- // 規則を適用するリソースを作成します
- // ニュースレター
- $acl->addResource(new Zend_Acl_Resource('newsletter'));
- // ニュース
- $acl->addResource(new Zend_Acl_Resource('news'));
- // 最新ニュース
- $acl->addResource(new Zend_Acl_Resource('latest'), 'news');
- // お知らせ
- $acl->addResource(new Zend_Acl_Resource('announcement'), 'news');
- ]]></programlisting>
- <para>
- そして、次のような特別な規則を、<acronym>ACL</acronym> の該当範囲に適用します。
- </para>
- <programlisting language="php"><![CDATA[
- // Marketing は、ニュースレターおよび最新ニュースを公開、保存できなければなりません
- $acl->allow('marketing',
- array('newsletter', 'latest'),
- array('publish', 'archive'));
- // Staff (そして継承による marketing) は最新ニュースの改変ができません
- $acl->deny('staff', 'latest', 'revise');
- // 全員 (administrators を含む) はお知らせを保存することができません
- $acl->deny(null, 'announcement', 'archive');
- ]]></programlisting>
- <para>
- これで、最新の変更内容を反映した <acronym>ACL</acronym> への問い合わせが行えるようになります。
- </para>
- <programlisting language="php"><![CDATA[
- echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
- "allowed" : "denied";
- // denied となります
- echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
- "allowed" : "denied";
- // allowed となります
- echo $acl->isAllowed('staff', 'latest', 'publish') ?
- "allowed" : "denied";
- // denied となります
- echo $acl->isAllowed('marketing', 'latest', 'publish') ?
- "allowed" : "denied";
- // allowed となります
- echo $acl->isAllowed('marketing', 'latest', 'archive') ?
- "allowed" : "denied";
- // allowed となります
- echo $acl->isAllowed('marketing', 'latest', 'revise') ?
- "allowed" : "denied";
- // denied となります
- echo $acl->isAllowed('editor', 'announcement', 'archive') ?
- "allowed" : "denied";
- // denied となります
- echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
- "allowed" : "denied";
- // denied となります
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.acl.refining.removing">
- <title>アクセス制御の削除</title>
- <para>
- <acronym>ACL</acronym> からひとつあるいは複数のアクセス規則を削除するには、
- <methodname>removeAllow()</methodname> メソッドあるいは <methodname>removeDeny()</methodname>
- メソッドを使用します。<methodname>allow()</methodname> および <methodname>deny()</methodname>
- と同様、<constant>NULL</constant> 値を指定すると
- すべてのロールやリソース、権限を表すことになります。
- </para>
- <programlisting language="php"><![CDATA[
- // 最新ニュースの改変拒否を staff (そして継承による marketing) から削除します
- $acl->removeDeny('staff', 'latest', 'revise');
- echo $acl->isAllowed('marketing', 'latest', 'revise') ?
- "allowed" : "denied";
- // allowed となります
- // ニュースレターの公開や保存の権限を、marketing から取り除きます
- $acl->removeAllow('marketing',
- 'newsletter',
- array('publish', 'archive'));
- echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
- "allowed" : "denied";
- // denied となります
- echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
- "allowed" : "denied";
- // denied となります
- ]]></programlisting>
- <para>
- 上で説明したように、徐々に権限を変更していくこともできますが、
- 権限に対して <constant>NULL</constant> 値を設定すると、
- このような変更を一括で行うことができます。
- </para>
- <programlisting language="php"><![CDATA[
- // marketing に対して、最新のニュースへのアクセスを許可します
- $acl->allow('marketing', 'latest');
- echo $acl->isAllowed('marketing', 'latest', 'publish') ?
- "allowed" : "denied";
- // allowed となります
- echo $acl->isAllowed('marketing', 'latest', 'archive') ?
- "allowed" : "denied";
- // allowed となります
- echo $acl->isAllowed('marketing', 'latest', 'anything') ?
- "allowed" : "denied";
- // allowed となります
- ]]></programlisting>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|