【问题标题】:How to organize and manage an ACL?如何组织和管理 ACL?
【发布时间】:2011-08-17 21:20:30
【问题描述】:

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 如何在大型站点上工作?会出现什么问题?如何处理级联权限?

【问题讨论】:

    标签: php permissions acl


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多