如何组织和管理ACL?

时间:2011-05-03 16:49:24

标签: php permissions acl

Zend_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如何在大型网站上运行?出现什么问题?如何处理级联权限?

1 个答案:

答案 0 :(得分:1)

您可以将角色存储在数据库中,并使用memcache将对象缓存在内存中,这样您只需在添加或更改新角色时查询数据库。至于实现ACL,因为它将在系统范围内使用,您可以在Bootstrap.php文件中初始化它,然后将该对象存储在Zend_Registry中,以便整个应用程序可以访问它。

应用这些规则可以在不同的点上进行。您可能希望在自定义路由器中应用路由,或者可能在控制器级别的更高级别应用路由。如果扩展Zend_Controller_Action,则可以将ACL规则放在此主控制器中,从该控制器派生每个其他控制器。您可以在_init()方法中检查ACL权限。系统中可能还有其他需要ACL的点,或者想要检查它,具体取决于您构建它的方式和方式(这就是为什么要将ACL存储在注册表中)。