2011-05-03 63 views
2

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

回答

1

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

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