我使用 Manning Press 的“Zend Framework in Action”一书中的修改版本(如果您现在需要,可以下载 PDF 格式)。我认为您可以从本书的站点下载随附的代码。你想看看第 7 章的代码。
概述:
控制器是资源,动作是权限。
将您的允许和拒绝放在控制器的 init 方法中。
我也在使用他们的 Controller_Action_Helper_Acl 的定制版本。
每个控制器都有一个公共的静态 getAcls 方法:
public static function getAcls($actionName)
{
$acls = array();
$acls['roles'] = array('guest');
$acls['privileges'] = array('index','list','view');
return $acls;
}
这让其他控制器可以询问此控制器的权限。
每个控制器的 init 方法都会调用 $this->_initAcls(),它是在我自己的基本控制器中定义的:
public function init()
{
parent::init(); // sets up ACLs
}
父母看起来像这样:
public function init()
{
$this->_initAcls(); // init access control lists.
}
protected function _initAcls()
{
$to_call = array(get_class($this), 'getAcls');
$acls = call_user_func($to_call, $this->getRequest()->getActionName());
// i.e. PageController::getAcls($this->getRequest()->getActionName());
if(isset($acls['roles']) && is_array($acls['roles']))
{
if(count($acls['roles'])==0) { $acls['roles'] = null; }
if(count($acls['privileges'])==0){ $acls['privileges'] = null; }
$this->_helper->acl->allow($acls['roles'], $acls['privileges']);
}
}
然后我只有一个函数叫做:
aclink($link_text, $link_url, $module, $resource, $privilege);
它调用 {$resource}Controller::getAcls() 并对它们进行权限检查。
如果他们有权限,则返回链接,否则返回 ''。
function aclink($link_text, $link_url, $module, $resource, $privilege)
{
$auth = Zend_Auth::getInstance();
$acl = new Acl(); //wrapper for Zend_Acl
if(!$acl->has($resource))
{
$acl->add(new Zend_Acl_Resource($resource));
}
require_once ROOT.'/application/'.$module.'/controllers/'.ucwords($resource).'Controller.php';
$to_call = array(ucwords($resource).'Controller', 'getAcls');
$acls = call_user_func($to_call, $privilege);
if(isset($acls['roles']) && is_array($acls['roles']))
{
if(count($acls['roles'])==0) { $acls['roles'] = null; }
if(count($acls['privileges'])==0){ $acls['privileges'] = null; }
$acl->allow($acls['roles'], $resource, $acls['privileges']);
}
$result = $acl->isAllowed($auth, $resource, $privilege);
if($result)
{
return '<a href="'.$link_url.'" class="aclink">'.$link_text.'</a>';
}
else
{
return '';
}
}