【发布时间】:2013-05-04 00:18:27
【问题描述】:
我正在为自定义框架的访问控制实现而苦苦挣扎。
不需要 RBAC 粒度,所以我决定使用某种 ACL 来存放资源 控制器动作。
这是数据库结构:
用户:
- 约翰
- 玛丽
- 格雷格
用户组:
- 管理员
- 会计师
- 经理
users_to_user_groups:
- John => 管理员
- 玛丽 => 会计师
- 格雷格 => 经理
资源(控制器操作):
- 用户/编辑
- 发票/添加
- 客户/删除
resources_to_user_groups:
- 用户/编辑 => 管理员
- 发票/添加 => 会计师
- 客户/删除 => 经理
这是[伪]代码。
$user = new User; // This will be currently logged in user ...
$acl = new Acl($user);
$dispatcher = new Dispatcher($acl);
$dispatcher->dispatch('users', 'new');
class Dispatcher
{
public function dispatch($controller, $action)
{
$permission = $controller . '/' . $action;
if(!$this->acl->isAllowed($permission))
{
throw new AccessDeniedException("Access denied");
}
// User is authorized to execute this action, dispatch ...
}
}
我喜欢这种方法...直到我意识到还有很多 XHR 请求。
例如,发票列表使用 XHR 请求获取总金额,订单列表使用 XHR 请求 加载订单位置和其他数据等。
所以,一定有一些资源分组,比如新表resource_groups:
- 发票清单(invoices/list, invoices/xhr_get_total_amount)
- 订单列表(orders/list、orders/xhr_get_positons_for_order、orders/xhr_get_some_other_data)
- 添加新用户 (users/new) # 单个操作,新用户输入表单不使用 XHR 请求
...而不是将资源分配给用户组,而是将资源组分配给用户组。
感觉好复杂。这是正确的方法吗?有什么可以改进的?有什么框架可以解决这个问题吗?
【问题讨论】:
-
为什么 XHR 很重要?具有相同权限的同一用户以相同的方式访问相同的资源,只是打包并以不同的方式交付给客户端。如果还有更多内容,那么这里几乎没有足够的信息能够为您提供任何有意义的帮助。
-
Jason - 因为单个“资源”(更好的措辞是 DudeOnRock 提到的“活动”)可以包含单个静态 HTTP 请求,或者另外调用一个或多个 XHR 请求。因此,我们不能假设每个 controller::action 对都是“权限”,我们需要以某种方式对它们进行分组。
-
我觉得你好像在某个地方转错了方向。如果您基于“请求”创建权限(或者,尽可能直截了当,每个 URL 都有自己的特定权限),那么您将走上一条无法维护的道路。创建组以添加这些请求只是稍微抽象了维护问题。现在,您不会是第一个采用这种方法的人(我工作中使用的遗留系统,最初基于 osCommerce,控制每个文件名的访问),但是如果您的应用程序现在或希望变得更简单大小,你会头疼的。
-
是的,你对我的初始计划是正确的,每个控制器::动作对(或 URL)都需要单独的权限。但正如我在帖子末尾提到的,我认为需要将一些操作组合在一起以形成一个单一的权限/活动。你建议的方法是什么?我给你一个例子 - 活动“查看日志”,它由 2 个控制器操作组成 - 一个静态 HTTP 请求,它绘制一些表格 HTML 标记,在这个页面中也是一个 XHR 请求,它获取最新的日志记录,比如说,每 30 秒。你如何在单一权限下合并它们?
-
@LaurisB:你的 XHR 请求可以调用几个不同的函数来代表接收脚本中的一个活动。如果其中一些功能不需要权限,那很好,如果所有功能都需要,则单独验证每个活动。
标签: php ajax xmlhttprequest authorization acl