Coding Samples, Tutorials, Code Snippets, Articles, How-To`s - From Beginners to Expert. Stay tuned.
Share your knowledge. Regardless what experience you have made with the Zend Framework - Let all benefit.

Search Manual:

Please Sign in or Register

Available Languages

 


Manual for Zend Framework 1.0.3

2.2. アクセス制御の洗練

2.2.1. 的確なアクセス制御

先ほどの節で定義した基本的な ACL では、さまざまな規則を ACL 全体 (すべてのリソース) に対して適用しました。 しかし実際には、アクセス制御にはさまざまな例外がつきものですし、 もっと複雑なものになるでしょう。 Zend_Acl では、このような目的のためにも直感的で柔軟な方法で対応できます。

例にあげた CMS では大半のユーザを 'staff' グループでまとめて管理していました。 ここでは新しく 'marketing' グループを作成し、CMS のニュースレターや最新ニュースへのアクセスを許可させる必要があるでしょう。 このグループには、ニュースレターや最新ニュースの公開や保存権限があれば十分でしょう。

さらに 'staff' グループに対しては、ニュースの内容は閲覧できますが 最新ニュースの改変はできないようにします。 最後に、(administrators を含む) 全員は 'お知らせ' を保存できないようにします。これは、1 日から 2 日程度の有効期限しか持たないものだからです。

まず、ロールレジストリを変更してこれらの変更を反映させます。 'marketing' グループを作成して 'staff' と同様の基本権限を持たせることにしたので、 'marketing' を作成し、'staff' の権限を継承させます。

<?php
// 新しいグループ marketing は staff の権限を引き継ぎます
$acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
        

次に、これらのアクセス制御は特定のリソース (例: "newsletter"、"latest news"、"announcement news") に限定されることに注目しましょう。ここで、これらのリソースを追加します。

<?php
// 規則を適用するリソースを作成します
require_once 'Zend/Acl/Resource.php';
$acl->add(new Zend_Acl_Resource('newsletter'));           // ニュースレター
$acl->add(new Zend_Acl_Resource('news'));                 // ニュース
$acl->add(new Zend_Acl_Resource('latest'), 'news');       // 最新ニュース
$acl->add(new Zend_Acl_Resource('announcement'), 'news'); // お知らせ
        

そして、次のような特別な規則を、ACL の該当範囲に適用します。

<?php
// Marketing は、ニュースレターおよび最新ニュースを公開、保存できなければなりません
$acl->allow('marketing', array('newsletter', 'latest'), array('publish', 'archive'));

// Staff (そして継承による marketing) は最新ニュースの改変ができません
$acl->deny('staff', 'latest', 'revise');

// 全員 (administrators を含む) はお知らせを保存することができません
$acl->deny(null, 'announcement', 'archive');
        

これで、最新の変更内容を反映した ACL への問い合わせが行えるようになります。

<?php
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 となります
        

2.2.2. アクセス制御の削除

ACL からひとつあるいは複数のアクセス規則を削除するには、 removeAllow() メソッドあるいは removeDeny() メソッドを使用します。allow() および deny() と同様、null 値を指定すると すべてのロールやリソース、権限を表すことになります。

<?php
// 最新ニュースの改変拒否を 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 となります
        

上で説明したように、徐々に権限を変更していくこともできますが、 権限に対して null 値を設定すると、 このような変更を一括で行うことができます。

<?php
// 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 となります
        

Welcome!

Welcome to ZFResource - The Resource for the Zend Framework.
As you see, the website is in still in progress. Many features ( like Code Directory, Code Samples, User written Tutorials, Examples and News,...) will be online in near future.
At the moment, you can search and browse the manual in your language of choice. Don't forget to come back later to benefit from the new features.


Help Wanted:

We are still searching for people want to help building this site. If you want to see this website in your language or you have any suggestions for this site please send us an email