Zend Frameworkワークショップ。 パート3:Zend_Acl







今日は、多くの役割とリソースを持つシステム用のAclを作成する例を見ていきます。



Habrauser Anexroidは、このようなプロジェクトの説明を親切に提供してくれました。

次のアクセス権があります:管理者、管理者パネルへのアクセス権。 また、管理パネルには20〜30セクション、5人の管理者がいます。 誰もが異なるアクセス権を持っています。 つまり、誰かが2〜3個のセクションを持ち、誰かが20個すべてを持っています。すべてのメニュー項目はデータベースに保存されます。

ユーザー-サイトに登録。 写真アルバムを作成したり、キャプチャなしでニュースにコメントしたりできます。 +ゲストができること。

エンタープライズ-購入したパッケージに応じて、カタログに個人ページがあります-アカウントのさまざまなアイテム。

まあ、すべてを無制限に見ることができるゲスト。 コメント-キャプチャ付き。

まだコンサルタントがいます-彼らは相談で質問に答えます。

また、企業とコンサルタント-登録はありません、彼らは管理者によって追加されます。 +繰り返しますが、データベース内のすべてのテーブルは個別です-個別管理者、個別ユーザー、個別-エンタープライズ、個別-コンサルタント。



まず、ロールとリソースを決定し、リソースとロールの継承の階層を構成します。







この例では、リソース階層の上部はロールの階層と構造が一致しています。 リソースの階層を簡単に表示するために、Admin1-N、CompanyPackage1-Nを除くアクセス権のリストに各ロールの抽象リソースを追加します。 これは、GuestおよびUserステータスのリソースと、すべての管理者および会社の共通リソースが単純なツリー構造を持っているためです。これは、交差するツリーの下位ノードについては言えません。 たとえば、Admin1およびAdmin2は、Add News共有リソースにアクセスできますが、残念ながらZend_Aclリソースツリーは多重継承をサポートしていません。 したがって、Admin1-N、CompanyPackage1-Nロールのリソースは例外として割り当てられ、目的のロールに明示的に割り当てられます。







そのため、リソース階層を把握し、Aclを直接作成します。 これを行うには、Zend_Aclクラスを拡張します。

<?php class Acl extends Zend_Acl { public function __construct() { //   $this->addRole('guest'); $this->addRole('user', 'guest'); $this->addRole('admin', 'user'); $this->addRole('company', 'user'); $this->addRole('company-package-1', 'company'); $this->addRole('company-package-2', 'company'); $this->addRole('company-package-3', 'company'); // ... $this->addRole('admin-1', 'admin'); $this->addRole('admin-2', 'admin'); // ... $this->addRole('admin-5', 'admin'); //  // //   ! $this->add(new Zend_Acl_Resource('guest_res')); //    ,    guest_res $this->add(new Zend_Acl_Resource('add-comments-with-captcha'), 'guest_res'); //   ! $this->add(new Zend_Acl_Resource('user_res')); //    ,    user_res $this->add(new Zend_Acl_Resource('add-comments'), 'user_res'); //   ! $this->add(new Zend_Acl_Resource('admin_res')); //      ,    admin_res $this->add(new Zend_Acl_Resource('admin-tools-list'), 'admin_res'); //   ! $this->add(new Zend_Acl_Resource('company_res')); //      ,    company_res $this->add(new Zend_Acl_Resource('show-company-statistics'), 'company_res'); //      ,    $this->add(new Zend_Acl_Resource('advertise')); $this->add(new Zend_Acl_Resource('add-company')); // , -   $this->deny(null, null, null); $this->allow('guest', 'guest_res', 'show'); $this->allow('user', 'user_res', 'show'); $this->allow('admin','admin_res', 'show'); $this->allow('company','company_res', 'show'); //        $this->allow('company-package-1','advertise', 'show'); $this->allow('admin-1','add-company', 'show'); } }
      
      





そして、すべてが期待どおりに機能することをすぐに確認します。

 echo $acl->isAllowed('guest', 'add-comments-with-captcha', 'show')?'yes':'no'; // yes echo $acl->isAllowed('guest', 'add-comments', 'show')?'yes':'no'; // no echo $acl->isAllowed('admin-1', 'add-company', 'show')?'yes':'no'; // yes echo $acl->isAllowed('company-package-2', 'advertise', 'show')?'yes':'no'; // no
      
      





この例では、特定のページを表示する機能に対応する1つのショー特権を簡略化して紹介しました。 ただし、この例を拡張し、必要に応じてさまざまな特権を追加できます。

また、このコードは、会社のパッケージと管理者が追加されるという事実に対応していないことは明らかであり、他の役割の権限は時間とともに変化する可能性があります。 したがって、データをデータベースに保存し、必要に応じてオブジェクトを構築して必要なデータを抽出するか、Aclクラスのシリアル化されたインスタンスを何らかの種類のストレージ(memcachedなど)に保存する必要があります。 この選択はあなた次第です;私は個人的に2番目のオプションを好みます。

このシリーズの最初の投稿では 、リソースとして "controller / action"のような文字列を使用してAclを作成する方法を検討しました。これは小さなプロジェクトで非常に便利です。



All Articles