我正在为自定义框架的访问控制实现而苦苦挣扎。
不需要 RBAC 粒度,因此我决定使用某种 ACL,其中资源将成为控制器操作。
下面是数据库结构:
用户:
- 约翰
- 玛丽
- 格雷格
用户组:
- 管理员
- 会计师
- 经理人
users_to_user_groups:
- 约翰 => 管理员
- 玛丽 => 会计师
- 格雷格 => 经理
资源(控制器操作):
- 用户/编辑
- 发票/添加
- 客户/删除
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 请求
...而不是将资源分配给用户组,而是将资源组分配给用户组。
感觉好复杂 这是正确的方法吗?有什么可以改进的?有什么框架可以解决这个问题吗?