以Zend_ACL为例,我想知道如何组织这个项目。当然这个例子很好,很整洁,但是一个真实的网站要复杂得多。如何组织和管理ACL?
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'));
$acl->addRole(new Zend_Acl_Role('member'));
$acl->addRole(new Zend_Acl_Role('admin'));
$parents = array('guest', 'member', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);
$acl->add(new Zend_Acl_Resource('someResource'));
$acl->deny('guest', 'someResource');
$acl->allow('member', 'someResource');
echo ($acl->isAllowed('guest', 'someResource') ? 'allowed' : 'denied');
鉴于我的网站上的每个控制器/页面都会进行某种访问检查,我需要规则在全球范围内可用。这是否意味着我需要创建一个庞大的配置文件或类来设置加载的所有规则?这不会浪费很多内存吗?
但是,如果我只设置了每个控制器所需的规则,这将违背ACL权限的目的?使用ACL的主要原因是为了避免像这样在整个代码库中传播权限:
Admin_Controller
{
public function action()
{
if($user->role !== 'admin')
{
die('not allowed');
}
}
}
那么变化呢?如果ACL规则存储在管理员可以轻松更改权限的数据库中,该怎么办?他们是否应该全部下载每个页面请求?这不会给系统带来很大的负担吗?
简而言之,ACL如何在大型网站上运行?发生了什么问题?如何处理级联权限?