以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规则存储在管理员可以轻松更改权限的数据库中,该怎么办?每个页面请求都应该下载吗?难道这不会给系统带来很大负担吗?
简而言之,是如何在大型站点上工作的?出了什么问题?如何处理级联权限?
发布于 2011-05-04 09:35:36
您可以使用memcache将角色存储在数据库中,并将对象缓存在内存中,这样只需要在添加或更改新角色时查询db。至于实现ACL,因为它将在系统范围内使用,您可以在Bootstrap.php文件中初始化它,然后将对象存储在Zend_Registry中,以便整个应用程序都可以访问它。
应用这些规则可以在不同的时间点发生。您可能希望在自定义路由器中应用这些路由,或者在控制器级别上应用更高级别的路由。如果您扩展了Zend_Controller_Action,您可以将您的ACL规则放在这个主控制器中,每个其他控制器都是从这个主控制器中派生出来的。可以在_init()方法中检查ACL权限。系统中可能有其他点需要ACL,或者希望检查ACL,这取决于您构建ACL的内容和方式(这就是为什么要将ACL存储在注册表中)。
https://stackoverflow.com/questions/5872867
复制相似问题