Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何组织和管理ACL?_Php_Permissions_Acl - Fatal编程技术网

Php 如何组织和管理ACL?

Php 如何组织和管理ACL?,php,permissions,acl,Php,Permissions,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', 'ad

以这个为例,我想知道应该如何组织一个项目。当然,这个例子非常好,但是一个真实的站点要复杂得多

$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如何在大型站点上工作?发生了什么问题?级联权限是如何处理的?

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

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