0

ZFでアプリケーションを開発しています。

私は大きな解決できない問題に直面しました-ZEND_Acl

私が見つけたすべての記事がMODULEベースのアプリケーションに関連していないため、私には解決できません。

最近、モデルでACLを使用することを説明したpacktpubの記事を発見しました

しかし、それは複雑で複雑に見え、私が探していたものではありません。

それはStoreFrontを持っています-そしてすべてがそこに入ります、私の場合、私はすべてをモジュールに分けています。

他の多くのソースやドキュメントでACL実装手法を見てきました。

ACL実装の開発/構築を解決する方法と、どこから始めればよいのか(そして実際にはどのようにすればよいのか)がわかりません。

私のアプリケーションは次のようになります。

application/ 
       configs/
       layouts/
               master.phtml
               admin.phtml
       modules/
               users/
                    controllers/
                                adminController
                                indexContoller
                    models/
                    views/
               blog/
                    controllers/
                                adminController
                                indexController
                    models/
                    views/
               orders/
                    controllers/
                                adminController
                                indexController
                    models/
                    views/

ご覧のとおり、adminControllersには管理機能があり、indexControllersにはフロントエンド機能があります。

モジュール内にadminControllersとビューを配置するという考え方は、管理者用に個別のモジュールを作成するのではなく、モジュールの分散アーキテクチャを使用することです。

ここで、アプリケーションにACLを実装したいと思います。

通常、私には管理者(superadmin、Editor、Publisher)がいadminControllersて、それぞれを除くすべてにアクセスしactionます。確かに、ユーザーはadminControllersにアクセスできません。

およびユーザー-訪問者、登録済み、有料なので、階層は次のようになります。

$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('visitor')); 
$acl->addRole(new Zend_Acl_Role('registered'), 'visitor');
$acl->addRole(new Zend_Acl_Role('paid'), 'registered');
$acl->addRole(new Zend_Acl_Role('publisher'), 'paid');
$acl->addRole(new Zend_Acl_Role('editor'), 'publisher');
$acl->addRole(new Zend_Acl_Role('superadmin'), 'editor');  

この階層は、アプリケーション間で利用できます。

目標は、各モジュール内に書き込み権限とリソースを書き込むことです。これにより、特定のプロジェクトにモジュールが存在しない場合に、ACLドキュメントにゴミが入るのを防ぐことができます。

私はまだYouTubeでAlexanderRomanenkoのチュートリアルのアプローチをテストしていませんが、ACLを開発するとき、彼はFrontControllerプラグインからACLをロードしています-私の場合のアプローチは何でしょうか?

また、ACLを実装するときは、将来に備えてACL動的アサーションを考慮する必要があります。また、「VISITORS」のような瞬間はコメントを投稿できず、REGISTEREDユーザーはブログで有料記事を見ることができません。

ACLをプロジェクトに統合するのを手伝ってくれるかもしれませんし、HOW TOを見つけて、指示に従うための優れたリソースを知っているかもしれません。

編集

ACLのpreDispatch()を持つコントローラープラグインは、各モジュール(この場合はUSERS)用になります(右?)

モジュール(USERS)のブートストラップでプラグインを自動ロードしようとしました:

$plugin = Zend_Controller_Front::getInstance();
$plugin->registerPlugin(new Users_Plugin_AccessCheck());

しかし、アプリケーション全体でこのプラグインを使用し、エラーが発生するようです。

Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Session must be started before any output has been sent to the browser; output started in H:\Server\xampp\htdocs\c2g\application\modules\users\plugins\AccessCheck.php/6' in H:\Server\xampp\htdocs\c2g\library\Zend\Session.php:451 Stack trace: #0 ... So on

プラグインが2回読み込まれるためだと思います。しかし、これはモジュール(USERS)自体を除くすべてのページで発生し続けます。

4

1 に答える 1

1

私は自分のアプリケーションの1つで同様の構造を使用しているので、正しい方向に向けることができれば幸いです。設定方法は次のとおりです。

  • ロールはメインアプリケーションのブートストラップ(これは質問に含めたコード)で初期化され、他の場所に簡単にアクセスできるようにZend_Aclオブジェクトをレジストリに保存します
  • 各モジュールのブートストラップは、独自のACLリソースを設定し、どの役割が何にアクセスできるかを定義します
  • ACLチェックは、コントローラープラグインを使用して行われます。

リソース名は単なる任意の文字列であるため、規則に準拠している限り、プラグインでACLチェックを自動的に実行できます。たとえば、必要なのは各モジュールのインデックスと管理コントローラーのリソースだけだとします。各モジュールのブートストラップには、次のようなものがあります。

protected function _initAcl()
{
    $acl = Zend_Registry::get('acl');

    $frontendResource = new Zend_Acl_Resource('users');
    $adminResource = new Zend_Acl_Resource('users-admin');

    $acl->addResource($frontendResource);
    $acl->addResource($adminResource);

    // allow everyone frontend access
    $acl->allow('visitor', $frontendResource);

    // admins only for admin access
    $acl->allow('superadmin', $adminResource);
}

次に、ACLコントローラープラグインで、リクエストオブジェクトを調べてリソース名を計算し、次のチェックを実行します。

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $acl = Zend_Registry::get('acl');

    $currentResource = $request->getModuleName().'-'.$request->getControllerName();
    if ($acl->has($currentResource) && !$acl->isAllowed($user->role, $currentResource)) {
        // permissions error
    }
}
于 2013-01-31T17:30:14.653 に答える