如何组织和管理ACL?

2024-05-22

采取Zend_ACL http://framework.zend.com/manual/en/zend.acl.html作为我的例子,我想知道应该如何为项目组织它。当然,这个例子非常漂亮和简洁,但真实的网站要复杂得多。

$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_Registry 中,以便整个应用程序都可以访问它。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何组织和管理ACL? 的相关文章

随机推荐

  • AndroidResultContracts.TakePicture() 返回布尔值而不是位图

    合同已变更为退货Boolean代替Bitmap从 androidx activity 版本 1 2 0 alpha05 开始 我怎样才能使用Boolean由内置返回AndroidResultContracts TakePicture htt
  • React Native 反应导航 SafeArea 问题

    我更新了我的android项目 react navigation was 3 x 搬去5 x 决定实施必要的更改 但它不想工作 从反应导航页面复制了示例 但仍然显示相同的错误 有人知道问题出在哪里吗 当我用谷歌搜索一半的互联网时找不到解决方
  • XHR 可以在readyState=DONE 的情况下多次触发onreadystatechange 吗?

    The W3C spec http www w3 org TR XMLHttpRequest event xhr readystatechange建议以下实施 一些简单的代码可以对通过网络获取的 XML 文档中的数据执行某些操作 funct
  • 使用 PHPUnit 和 Mockery 进行 Laravel 测试 - 设置控制器测试的依赖关系

    在终于通过了我愚蠢的简单测试后 我有一种感觉 我做得不对 我有一个 SessionsController 负责显示登录页面并让用户登录 我决定不使用外观 这样我就不必扩展 Laravel 的 TestCase 并在单元测试中承受性能影响 因
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 无法使用 -cp 和 jar 位置通过 Java ProcessBuilder 查找或加载类

    我正在尝试使用ProcessBuilder在我的系统中启动 JUnit 测试Java应用 我可以毫无问题地从命令行运行相同的命令 从 ProcessBuilder 运行时是否需要使用 jar 的绝对路径 还是可以使用相对路径 在命令行上运行
  • 不应该出现的错误

    这是我的第一个问题 如果我做错了什么 请原谅 我正在尽力 所以我得到了这个简单的代码
  • C++ 联合位域任务

    有人可以澄清我为什么要使用 union 以及 cin ed 变量和位字段的相同地址的目的是什么 Schildts C 书中的任务 换句话说 为什么我要使用 union 字符ch 结构字节位 以二进制形式显示字符的 ASCII 码 inclu
  • R 如何将 curly curly 与 filter 或 filter_ 一起使用?

    我正在回答这个question https stackoverflow com questions 54350264 dplyr unquoting does not work with filter function评论者建议 ensym
  • 如何在 Laravel 5 中使用 Orchestral/Tenanti 构建具有多个数据库的多租户应用程序?

    我正在尝试使用 Laravel 5 构建和应用程序 它应该是使用多个数据库的多租户数据库架构 我的雇主出于安全目的要求这样做 我尝试手动管理主数据库迁移和租户迁移 但失败了 所以我决定借助 Laravel 特定包的帮助 这应该是我所需要的
  • 从 log4j 附加程序中排除类

    我有一个 log4j properties 文件 如下所示 log4j logger com foo INFO foo log log4j logger com foo BarImpl INFO bar log 通常对于与包结构匹配的类co
  • SQL Android 错误:没有这样的表

    因此 每次我在位于 AddContacts 类中的 EditText 字段中输入数据时 我的对话框都会显示我已成功添加信息 但在日志 cat 中却显示没有这样的表 contactsTable 我认为错误出在我的数据库类中的 onCreate
  • 我可以使用 python with 语句进行条件执行吗?

    我正在尝试编写支持以下语义的代码 with scope action name as s do something do some other stuff 除其他事项 设置 清理 外 范围应决定此部分是否应运行 例如 如果用户将程序配置为绕
  • 如何使用 open with 语句打开文件

    我正在研究如何在 Python 中进行文件输入和输出 我编写了以下代码 将一个文件中的名称列表 每行一个 读取到另一个文件中 同时根据文件中的名称检查名称并将文本附加到文件中出现的位置 该代码有效 可以做得更好吗 我想用with open
  • 如何在Spring WebApplicationContext运行时添加bean实例?

    所以 标题非常简单 我有一个处理程序类DynamicBeanHandler它实现了BeanDefinitionRegistryPostProcessorspring提供的接口 在这堂课中 我添加了多个SCOPE SINGLETONbean
  • 从 Google 位置历史记录下载 KML 数据的当前 URL?

    我需要在一段时间内以kml格式下载google位置历史数据 截至 2015 年 8 月 26 日 以下格式的 URL 均有效 https maps google com locationhistory b 0 kml startTime s
  • 如何让 JavaScript 发出蜂鸣声?

    我希望我的网页在用户超出我的最大字符限制时发出蜂鸣声
  • 从“C”代码调用“C++”类成员函数

    我们如何在 C 代码中调用 C 类成员函数 我有两个文件 cpp 其中我定义了一些带有成员函数的类和相应的 h 文件 其中包含一些其他帮助 cpp h 文件 现在我想在 C 文件中调用CPP文件的这些功能 我该怎么做 C没有thiscall
  • 使用“ref”关键字将 List 作为参数传递,C#

    friends 所以我一直在写一个简单的程序 基本上 我有一个类 3 个字符串 1 个整数 一些方法 我正在从文本文件初始化此类对象的值 我为此使用列表 问题在于初始化是一个单独的函数 我在这个函数中声明并初始化了 List 但是 我可能在
  • 如何组织和管理ACL?

    采取Zend ACL http framework zend com manual en zend acl html作为我的例子 我想知道应该如何为项目组织它 当然 这个例子非常漂亮和简洁 但真实的网站要复杂得多 acl new Zend