1

プロジェクトに zend ACL を実装しようとしていますが、3 つの問題に直面しています。問題を説明するために、これはコードです:

私のライブラリ プラグイン クラス

class Mylib_Controller_Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {

    private $_acl = null;
    private $_auth = null;

    public function __construct(Zend_Acl $acl, Zend_Auth $auth) {
        $this->_acl = $acl;
        $this->auth = $auth;
    }

    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $module = $request->getModuleName();
        $recourse = $request->getControllerName();
        $action = $request->getActionName();
            $identity = $this->auth->getStorage()->read();
    if (!isset($identity->Role)) {

            $role = 'default';
        } else {
        $role = $identity->Role;
        }

        if (!$this->_acl->isAllowed($role, $module, $recourse)) {
            $request->setModuleName('Admin')
                    ->setControllerName('User')
                    ->setActionName('index');
        }


    }

}

これは、models フォルダーにある私の ACL クラスです。

class Application_Model_DbTable_LibraryAcl extends Zend_Acl {

    public function __construct() {
        $this->addRole(new Zend_acl_Role('default'));
        $this->addRole(new Zend_acl_Role('User'));
        $this->addRole(new Zend_acl_Role('Admin'), 'User');



        $this->add(new Zend_Acl_Resource('Admin'))
                ->add(new Zend_Acl_Resource('default'))

        ;



        $this->allow('Admin')
                ->deny(array('User', 'default'));

    }

}

これは、bootstarp の _initAppAutoload です。

 $acl = new Application_Model_DbTable_LibraryAcl();

        $auth = Zend_Auth::getInstance();


        $fc = Zend_Controller_Front::getInstance();

        $fc->setControllerDirectory(array('default' => '/../application/modules/default/controllers',
            'Admin' => '/../application/modules/Admin/controllers'));
        $fc->registerPlugin(new Hyderlib_Controller_Plugin_AccessCheck($acl, $auth));

1) 最初の問題は、Application_Model_DbTable_LibraryAcl で、管理者と既定のフォルダーを使用したモジュラー実装を指定する方法、または各モジュールのリソースのツリーを作成する方法です。

2)データベースにデフォルトのロールはありませんが、アカウントを作成せずにこのデフォルトのユーザーに特権を持たせたいです(そのため、ロールのIDを確認し、ロールがない場合はデフォルトに設定します) . そうすることはベストプラクティスですか、それとも論理的ですか?

3) モジュールとコントローラーだけでなく、アクションの _isAllowed メソッドで Mylib_Controller_Plugin_AccessCheck クラスをチェックインするにはどうすればよいですか?

また、このリダイレクト方法でも、適切にリダイレクトされていないというエラーが表示されます

4

1 に答える 1

0

ここに行きます、

1) 最初の問題は、Application_Model_DbTable_LibraryAcl で、管理者と既定のフォルダーを使用したモジュラー実装を指定する方法、または各モジュールのリソースのツリーを作成する方法です。

基本的な実装については、すでにかなり近づいています。

class Application_Model_DbTable_LibraryAcl extends Zend_Acl {

public function __construct() {
    //add Roles
    //default role has very limited access
    $this->addRole(new Zend_acl_Role('default'));
    //User inherits all default access
    $this->addRole(new Zend_acl_Role('User'), 'default');
    //Admin inherits all User and Default acces
    $this->addRole(new Zend_acl_Role('Admin'), 'User');

    //add resources, caps don't seem to be a problem.
    //add Admin module resource
    $this->add(new Zend_Acl_Resource('admin'));
    //add Admin module Index controller resource, specify admin as parent 
    $this->add(new Zend_Acl_Resource('index'), 'admin');
    //add default module access
    $this->add(new Zend_Acl_Resource('default'));

    //add access rules
    //default in Zend_Acl is to deny all

    //everyone has access to the front page and the error page
    $this->allow(NULL, 'default', array('index', 'error'));
    $this->allow(NULL, 'default', array('index', 'index'));

    //add default user rules
    //allow default access to login logout
    $this->allow('default', 'default', array('login', 'logout'));

    //add crud access for User
    $this->allow('User', 'default', array('add', 'update'));

    //admin can do all
    $this->allow('Admin', NULL);
  }

}

これはおそらく完璧ではありませんが、何をすべきかのアイデアを与えるはずです。必要に応じて結果をテストできます。

2)データベースにデフォルトのロールはありませんが、アカウントを作成せずにこのデフォルトのユーザーに特権を持たせたいです(そのため、ロールのIDを確認し、ロールがない場合はデフォルトに設定します) . そうすることはベストプラクティスですか、それとも論理的ですか?

私にとってはうまくいきます。ユーザーが誰であるかを知るまで、ユーザーの役割を確認するのは本当に難しいです。チェックアウト。

3) モジュールとコントローラーだけでなく、アクションの _isAllowed メソッドで Mylib_Controller_Plugin_AccessCheck クラスをチェックインするにはどうすればよいですか?

public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $module   = $request->getModuleName();
        $recourse = $request->getControllerName();
        $action   = $request->getActionName();
            $identity = $this->auth->getStorage()->read();
    if (!isset($identity->Role)) {
            $role = 'default';
        } else {
            $role = $identity->Role;
        }
        //default role is default, if role is not allowed and not set to default send to error controller.
        if (!$this->_acl->isAllowed($role, $module, $recourse, $action)) {
            if ($role == 'default'){
                $request->setModuleName('default')
                        ->setControllerName('index')
                        ->setActionName('login');
            } else {
                $request->setModuleName('default')
                        ->setControllerName('error')
                        ->setActionName('noauth');
        }

アクション名を に追加すると、isAllowed()私のアプリではうまくいくようですが、テストはそれほど広範囲に及んでいません。したがって、注意して使用してください。私はあなたがまだこれらの概念について頭を悩ませようとしているようです.

于 2012-05-10T09:12:48.103 に答える