プラグインの 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 コードをモデルからこのプラグインに移動することでこの問題を解決しましたが、ACL をここに保持するのはあまり良い考えではないと思います。他のモデルとコントローラは Application_Model_LibraryAcl から ACL を参照でき、そのロールとリソースを参照できますが、プラグインの preDispatch は参照したくありません。
ZF1.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 を使用してもエラーは発生しません。