Zend_Aclとの連携
ウェブページにあるコンテンツのうち、一部は特定の人にのみ見せたい場合があると思います。例えば、一般向けの案内と身内だけが見られるスケジュールなどの情報を、同じウェブサイトで管理する場合です。このように、特定のページは特定の権限を持つ人にのみ見せるようにすることをアクセス管理と呼びます。
リンク集に関しても、特定の人のみが見られるページへのリンクは、権限のある人にのみ見せるのが良いでしょう。例えば、リスト1のリンクのうち、一部のリンクは特定の人にのみ見せるようにしましょう(リスト8)。
×のついたリンクは特定の人にのみ見せる。 (コンテナ) ├─サイト内トップ(index/index) │ ├─ ナビゲーションの種類 │ │ ├─ メニュー(index/menu) │ │ ├─ ×リンク(index/links) │ │ ├─ ×XMLサイトマップ(index/sitemap) │ │ └─ パンくずリスト(index/breacrumbs) | └─ ACLのテスト │ ├─ ACL(index/acl) │ └─ うまくいかない例(index/aclnotworking) └─×外部リンク集 ├─ (×)コードジン(http://codezine.jp/) └─ (×)Zend Framework(http://framework.zend.com/)
これを描画したものが図1です。
Zend_Navigationモジュールは、アクセス管理を担当するZend_Aclモジュールと組み合わせることで、簡単にリンク集のアクセス管理を行うことができます。
アクセス管理とZend_Acl
まず、アクセス管理について簡単に見ていきましょう。アクセス管理とは、どんな権利を持つ誰が、何をアクセスしてよいかを管理する機能です。Zend_Aclモジュールでは、「誰が」をロール、「権利」を特権(Privilege)、「何を」をリソースと呼びます。なお、リンク集の各リンクは、このうちの「何を見せるか」(リソース)に対応します。
ここでは単純に2種類のロール、2種類のリソースのあるアクセス管理を考えます。
種類 | 名前 | 説明 |
ロール | guest | 一般のユーザー |
member | 特定の権限を持つユーザー | |
リソースの種類 | public | すべてのユーザーが見られる |
private | 特定のユーザーのみが見られる |
このようなアクセス管理を作成します(リスト9)。
/* (1)アクセス管理の作成 */ $acl = new Zend_Acl(); /* (2)ロールの登録 */ $acl->addRole('guest'); $acl->addRole('member', 'guest'); //memberはguestの権限も持つ /* (3)リソースの種類の登録 */ $acl->addResource('private'); $acl->addResource('public'); /* (4)特権の登録 */ $acl->allow('guest', 'public'); $acl->allow('member', 'private');
アクセス管理の情報はZend_Aclクラスのオブジェクトに登録します。(1)で、まずZend_Aclクラスのオブジェクトを作成しています。
(2)では、ロールの登録を行なっています。ここではZend_AclのaddRoleメソッドを利用していますが、「member」を登録する際には2つ目の引数に「guest」を渡しています。これは、「member」が「guest」の持つ権限も持っていることを示すための書き方です。そして、(3)ではリソースの種類を登録しています。
(4)では特権の登録を行っています。最初に「guest」は「public」なリソースを見られることを登録しています。次に、「member」が「private」なリソースを見ることができることを登録しています。なお、「member」は「guest」の権限も持つため、「member」も「public」なリソースを見ることができることに注意してください。
これで、アクセス権限に関しての登録が終了しました。次は、どのリンクがどの種類のリソースにあたるかの設定です。
Zend_Navigationの設定
あるリンクが、どの種類のリソースに当たるかは、Zend_Navigation_Pageクラスのresouceプロパティに設定します。例えば、リスト8の「ナビゲーションの種類」の「リンク」(index/links)のリソースを「private」に設定するには、リスト10のようにリンク集のファイルに記述します。
... <links> <action>links</action> <controller>index</controller> <module>default</module> <label>リンク</label> <resource>private</resource> <!-- resourceプロパティ の設定--> </links> ...
ここまででアクセス管理の情報(Zend_Aclクラスのオブジェクト)と、各リンクのリソースの種類を設定しました。そうしたら、アクセス管理情報をNavigationビューヘルパのsetAclメソッドに設定すれば、アクセス管理情報をふまえたリンク集の描画が行われます(リスト11)。
/* Navigationビューヘルパを取得, * ACL を設定 */ $navigation = $this->view->navigation(); $navigation->setContainer($container); $navigation->setAcl($acl); //ここでアクセス管理情報を設定 $navigation->setRole('guest');
なお、あるリンクがアクセス管理の関係で描画されない場合、その子リンクも描画されません。リスト8で「外部リンク」には×が付いているため、その子リンクの「コードジン」「Zend Framework」はアクセス管理上は問題がなくても、描画されません。
おわりに
今回はZend_Navigationモジュールの応用を扱いました。Zend_Configモジュールを経由してファイルからリンク集を作成したり、Zend_Aclモジュールと連携してアクセス管理を行う方法について、それぞれ見ていきました。どちらもある程度以上の規模のサイトに関するリンク集を作成・管理する上では欠かせない技となるはずです。
次回は番外編で、Zend Frameworkの部品の紹介から少し脇道をし、Zend FrameworkとPHPのバージョンについて見ていきたいと思います。ご存知の通り、Zend Frameworkのバージョン1.9はPHPのバージョン5.2.4以降に対応しています。一方で、PHPのバージョン5.1系のみがインストールされている環境も多く存在します。そのような環境では何ができ、何ができないか、また同じようなことをするにはどのような解決方法があるか、簡単に見ていきたいと思います。