我正在使用 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);
}