【问题标题】:How to manage ACL rules?如何管理 ACL 规则?
【发布时间】:2013-06-12 02:46:22
【问题描述】:

我正在编写一个从“setter”方法中获取规则的 ACL 类:

<?php
$acl = new AccessControlList();
$acl->allow('someController', 'publicAction', 'guestRole');
$acl->deny('someController', 'privateAction', 'guestRole');

问题是:将这些规则存储在 ACL 对象中的最佳选择是什么?

目前,我正在考虑这样的数组:

array(
    'guest' => array(
        'someController' => array(
            'publicAction' => true,
            'privateAction' => false
        )
    ),
    'admin' => array (
        ...
    )
)

但是当它增长时它看起来会是性能灾难,记住读取数组(推断isAllowed(...)结果)和写入它的逻辑(规则冲突,覆盖,角色和资源之间的继承.. .).

也许我从一开始就错了,那些“二传手”就是问题所在。 是否有任何完善的设计模式可供遵循?

【问题讨论】:

  • 你看过zend_acl吗?可能会给你一些见解
  • 延迟加载 ACL 规则。
  • @AlexP 实际上我的实现是zend_acl 的简约版本(如果我真的理解它是如何工作的)。问题是我认为所有的简化都会为那个凌乱的数组付出代价。
  • @Orangepill,听起来不错,能激发答案吗?

标签: php design-patterns acl


【解决方案1】:

您可以通过延迟加载来避免填充整个 ACL 列表。

这是一种非常简单的方法,但这个概念应该可以扩展。这假设对于给定的请求,如果不是所有的 acl 检查都将针对单个用户角色,但相同的技术可以用于控制器或角色和控制器的组合。

以表格方式(csv、json、ini、db 表或 php 包含)定义 acl,只要你能得到,一个包含允许或拒绝、操作和角色的数组。我将使用 php 包含,因为它假设最少。对于每个角色,您将拥有其中一个。

return array(
     array("allow", "someController", "someAction"),
     array("deny", "someController", "someOtherAction")
);

在您的 AccessControlList 上添加一个方法来读取和处理此类文件。

protected function readConfig($role, $source){
     $dat = include($source);
     foreach($dat as $rule){
          switch($rule[0]){
              case "allow": $this->allow($rule[2], $rule[3], $role); break;
              case "deny":  $this->deny($rule[2], $rule[3], $role); break; 
         }
     }
}

添加将角色绑定到文件的方法。这只会添加到您现有的 acl

public function setRules($role, $source){
    $this->acl[$role] = $source;
}

然后在你的isAllowed中检查角色的acl节点是字符串还是数组

public function isAllowed($role, $subject, $action){
     if (is_string($this->acl[$role])){
             $this->readConfig($role, $this->acl[$role]);
     }
     // do your acl check as normal. 
}

【讨论】:

  • 如果我理解,您的解决方案依赖于每个角色都有独立的文件。当然,这是一个选项,但是您给了我将规则存储在唯一文件中并在 readConfig 方法中过滤它们(按角色和资源)的想法 - 没有 setRules 方法 -。现在我认为本质是将规则集与 ACL 对象分开,这开辟了许多从整个规则中选择范围的方法。这适合我:)
猜你喜欢
  • 2011-08-17
  • 2023-04-02
  • 2017-09-24
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多