我尝试在插件的 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 作为插件的一部分时没有任何错误。