アクセス制御リスト(ACL)をオブジェクト化した時点では、すべてが制限されている状態です。
とは言ってもまだそこには制限対象もなにも設定されてないのでまずはリソース(アクセス制限エリア)を追加登録していくことになります。
これでアクセスが制限されたエリアが出来ました。
でも一体何がこのエリアへの制限を受けるのか? ということを次に定義していくことになります。
アクセス制限を受ける階級(ロールと呼ぶ)を作成し、これに制限を割り当てます。
これでどういったエリア(リソース)があって、どういう階級(ロール)がいて、どの階級がどのエリアへのアクセスが許可されているかの定義(設定)ができました。
そうしたら「私は○○階級なんだけど、XXエリアへのアクセスはできるのかね?」といった問い合わせをACLに確認した結果をアクセス制御に利用できることになります。
if ($acl->isAllowed('guest', 'fooArea')) echo "ok!";
isで始まるメソッド名は「真」か「偽」を返すのでif文でチェックができます。
$acl->addRole('foo');
$acl->addResource('barArea');
上記はそれぞれ以下のように書くこともできます。
require_once 'Zend/Acl/Role.php';
$acl->addRole(new Zend_Acl_Role('foo'));
require_once 'Zend/Acl/Resource.php';
$acl->addResource(new Zend_Acl_Resource('barArea')); または $acl->add(new Zend_Acl_Resource('barArea'));
でもクラス呼び出しの記述の冗長さを考えると、前述のように内部で自動的にオブジェクト作成してもらった方が見やすいと思います。
ここで一旦、用語をまとめます。
リソース(アクセス制限エリア)
ロール(階級 guest, member, staff, editor, vip, classA, classS, administratorなど分かりやすいものを付ける)
エリアごとにアクセス制限を行う
表示結果
guest->publicArea: ok
member->publicArea: ok
member->memberArea: ok
admin->publicArea: ok
admin->memberArea: ok
admin->adminArea: ok
ここで先ほどのACL設定では使っていなかったdeny(allowと対になる設定)を使ってエリアへのアクセス権限を奪い取りたいと思います。
表示結果
member->memberArea: ok
admin->publicArea: ok
admin->memberArea: ok
admin->adminArea: ok
これを見るとguestのpublicAreaへのアクセス権を奪ったことにより、それを引き継いだmemberもまたpublicAreaへのアクセス権を奪われたのが分かります。
guestを引き継いでいないadminにはなにも影響はありません。
先ほどはエリア(リソース)に対して、ある階級(ロール)がアクセスできるかできないかどちらかでした。
同じエリア内でもある階級では閲覧する権限は持っていて、編集する権限は持っていないといった場合があります。
ということで閲覧や編集などの作業内容に名前(権限名)を付けてそれを階級(ロール)に付与していきます。
権限名は作業内容が分かりやすいように動詞を付けるのがコツです。
search (検索する権限)
create (作成する権限)
delete (削除する権限)
update (更新する権限)
insert (追加する権限)
view (閲覧する権限)
edit (編集する権限)
submit (実行する権限)
みたいな感じになると思います。
権限付与のやり方は、階級(ロール)を作成した後で先ほども使ったallow()やdeny()メソッドを使い、第三引数で指定します。
例えばエリア(リソース)を作成しないで階級(ロール)にview権限を与えると、すべてのリソースに対するview権限を与えることになります。
$acl->allow('guest', null, 'view');
これはguestにすべてのリソース(null指定)に対するview権限を付与する指定。
もし階級(ロール)に加えてエリア(リソース)も作成していれば、そのエリアで扱える権限を与えることができます。
$acl->allow('member', array('fooArea', 'barArea'), array('view', 'edit'));
これはmemberに"fooArea"と"barArea"エリアに対するview権限とedit権限を付与する指定。
このように複数を配列で指定することもできます。
この他いろいろな制限方法があります。
$acl->allow('guest', 'barArea', 'view'); // guest階級のbarAreaエリアでのview権限を許可
$acl->allow('guest', null, 'view'); // guest階級の全エリアでのview権限を許可
$acl->allow(null, array('barArea', 'bazArea'), 'view'); // 全階級のbarAreaとbazAreaエリアでのview権限を許可
$acl->deny('guest', 'barArea', 'view'); // guest階級のbarAreaエリアでのview権限を剥奪
$acl->deny('guest', null, 'view'); // guest階級の全エリアでのview権限を剥奪
$acl->deny(null, array('barArea', 'bazArea'), 'view'); // 全階級のbarAreaとbazAreaエリアでのview権限を剥奪