采取Zend_ACL http://framework.zend.com/manual/en/zend.acl.html作为我的例子,我想知道应该如何为项目组织它。当然,这个例子非常漂亮和简洁,但真实的网站要复杂得多。
$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 如何在大型站点上工作?会出现什么问题?级联权限如何处理?