我正在使用 ZF 1.12.2,我想为我的 Zend_Acl 权限创建一个黑名单,因为我的限制比允许的要少。我的 ACL 资源名称基于我的控制器名称,我的权限基于我的控制器操作名称。
现在,我拒绝这样的特权:
$acl->deny('user', null, 'User::login');
当我向我的用户控制器添加操作时,我希望用户角色被隐式授予对它们的访问权限,除非我明确拒绝它们。所以,如果我在我的用户控制器上添加一个编辑操作,我不必这样做:
$acl->allow('user', null, 'User::edit');
默认情况下,Zend_Acl::isAllowed
如果权限不存在则返回 false。除非我在调用父级之前对它们进行子类化并存储它们,否则也很难知道添加了哪些特权。我一直在尝试破译Zend_Acl::$_rules
,因为我认为它适合我的需要,并且我可以避免子类化。是否允许不存在的特权通过Zend_Acl::isAllowed
?
更新: 现在,我的工作子类方法My_Acl::isAllowed
如下。 My_Acl::__construct
接受一个数组配置,其中包含要添加的嵌套权限/资源的角色。
public function isAllowed($role = null, $resource = null, $privilege = null)
{
if (null !== $resource) {
if (is_string($resource)) {
$resource_id = $resource;
} else {
$resource_id = $resource->getResourceId();
}
if (!in_array($resource_id, array_keys($this->_resources))) {
return true;
}
}
if (null !== $privilege) {
if (!in_array($privilege, array_keys($this->_privileges))) {
return true;
}
}
return parent::isAllowed($role, $resource, $privilege);
}