3

http://framework.zend.com/manual/en/zend.controller.modular.htmlを読んで、Zendを使用してMVCを作成しました。

問題は、モジュラー構造でZend_ACLを使用する方法が見つからないことです。Zend_Aclには、モジュールを追加するメソッドがありません。コントローラーとアクションを追加することしかできません。

モジュラー構造でZend_Aclを使用するにはどうすればよいですか?Zend Frameworkの現在のバージョンでも可能ですか?

4

3 に答える 3

2

絶対です。それが私たちのプロジェクトで行っていることです。$request->getPathInfo()次のように、URIパス()を認証します/admin/user/edit。ここで、「admin」はモジュール、「user」はコントローラー、「edit」はアクションです。そして、アクセスプラグインがあります:

class Our_Application_Plugin_Access extends Zend_Controller_Plugin_Abstract {
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        foreach (self::current_roles() as $role) {
            if (
                Zend_Registry::get('bootstrap')->siteacl->isAllowed(
                    $role,
                    $request->getPathInfo()
                )
            ) return;
        }

        $this->not_allowed($request);
    }

   ...
}

application.iniに登録:

resources.frontController.plugins.access = "Our_Application_Plugin_Access"
于 2009-12-04T08:38:39.390 に答える
1

Ivanのその他のオプションは、「コントローラー」の代わりにリソースをsthに設定することです。「module-Controller」のように。

于 2009-12-04T14:16:58.853 に答える
1

可能です、毎回使っています。まず、Zend_Aclが検証するリソースは任意のエンティティ(文字列)であり、特定のモジュールやコントローラーに関連している必要はないことを忘れないでください。文字列「hello」を指定できます。プログラムでは、ユーザーがリソース「hello」にアクセスできるかどうかを確認できます。Zend_Navigationにリンクを表示するために、「ログインボタン」、「ログアウトボタン」などの任意のリソースをよく使用します。

あなたの場合、リソースを(aclで)モジュール/コントローラーレイアウトにマップできる文字列として定義する必要があります。たとえば、モジュールfooとコントローラーバーの場合、リソース「foo.bar」を定義します。アクセスチェック手順では、モジュールとコントローラーの名前を読み取り、それらを文字列にマージしてリソースを取得します。

実用的な例では:

class Application_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {

...

public function preDispatch(Zend_Controller_Request_Abstract $request){
    $module = $request->getModuleName();
    $controller = $request->getControllerName();
    $action = $request->getActionName();

...

   $resource = $module . '.' . $controller; //we create the custom resource according to the model we have defined
...

    $role=NULL;
    if($this->_auth->hasIdentity()){
        $identity = $this->_auth->getStorage()->read(); //depending on your implementation
        $role = $identity->role; //depending on your implementation
    }
...

  if(!$this->_acl->isAllowed($role, $resource, $action)){
        //deny access       
    }
    //allow access
}
}
于 2011-09-27T17:57:02.340 に答える