1

我尝试在插件的 preDispatch 方法中使用 ACL,但它看不到角色和资源。

在引导程序中:

protected function _initAutoLoad() {
...

$acl=new Application_Model_LibraryAcl();
$auth=Zend_Auth::getInstance();
$fc= Zend_Controller_Front::getInstance();
$fc->registerPlugin(new Application_Plugin_AccessCheck($acl, $auth));
...
}

在插件的 preDispatch 中:

$this->_acl = $acl;
$this->_auth=Zend_Auth::getInstance();
$identity = $this->_auth->getStorage()->read();
$role=$identity->role;
$resource = $request->getControllerName();
$action= $request->getActionName();
if($this->_acl->isAllowed($role, $resource, $action)){
...
}

而且我收到错误“找不到角色'管理员'”(此错误适用于所有角色)。无论我尝试做什么,它都不起作用。我通过将 ACL 代码从 Model 移动到这个插件来解决这个问题,但我认为将 ACL 保留在这里并不是一个好主意。其他模型和控制器可以从 Application_Model_LibraryAcl 及其角色和资源中看到 ACL,但插件的 preDispatch 不希望看到。

我使用 ZF 1.12。

编辑。我的 Application_Model_LibraryAcl() 是:

<?php
class Application_Model_LibraryAcl extends Zend_Acl {

    public function __construct(){




        //----------------------ADD ROLES HERE---------------------------------

        $acl = new Zend_Acl();
        $acl->addRole(new Zend_Acl_Role('guest'));
        $acl->addRole(new Zend_Acl_Role('user'), 'guest');
        $acl->addRole(new Zend_Acl_Role('admin'), 'user');


        //----------------------ADD RESOURCES HERE---------------------------------

        $acl->add(new Zend_Acl_Resource('authentication'));
        $acl->add(new Zend_Acl_Resource('index'));


        //----------------------ADD PERMITIONS HERE---------------------------------

        $acl->deny();

        $acl->allow('admin', NULL);
        $acl->allow('guest', 'authentication', array('login', 'registration', 'confirm', 'index' ));
        $acl->allow('guest', 'index', array('index' ));
        $acl->allow('user', 'index', array('index', 'confirm'));
        $acl->allow('user', 'authentication', array('logout' ));
        $acl->deny('user', 'authentication', array('login' ));


    }

}

我在 Zend 存储中保留当前用户的角色。当我将所有代码从模型移动到插件而不进行任何更改时,此代码工作正常。如果我使用模型,我在这个字符串上有错误:

if($this->_acl->isAllowed($role, $resource, $action))

并且当我使用 ACL 作为插件的一部分时没有任何错误。

4

0 回答 0