【发布时间】:2011-08-18 01:16:42
【问题描述】:
我想为 ACL 创建架构;但是,我在几种实现方式之间犹豫不决。
我很确定我不想处理级联权限,因为这会给后端和网站管理员带来很多困惑。
我想我也可以让用户一次只扮演一个角色。像这样的设置将允许在站点增长时根据需要添加角色和权限,而不会影响现有角色/规则。
起初我打算对数据进行规范化,并用三个表来表示关系。
ROLES { id, name }
RESOURCES { id, name }
PERMISSIONS { id, role_id, resource_id }
确定用户是否在某处被允许的查询如下所示:
SELECT id FROM resources WHERE name = ?
SELECT * FROM permissions WHERE role_id = ? AND resource_id = ? ($user_role_id, $resource->id)
然后我意识到我将只有大约 20 个资源,每个资源最多有 5 个操作(创建、更新、查看等),也许还有另外 8 个角色。这意味着我可以公然无视数据规范化,因为我永远不会有超过几百条可能的记录。
所以也许像这样的架构会更有意义。
ROLES { id, name }
PERMISSIONS { id, role_id, resource_name }
这将允许我在单个查询中查找记录
SELECT * FROM permissions WHERE role_id = ? AND permission = ? ($user_role_id, 'post.update')
那么,哪一个更正确呢? ACL 还有其他架构布局吗?
【问题讨论】:
-
您也可以使用正确、正确、规范化的模式在单个查询中查找权限。使用
JOIN。 -
我对级联权限的直接体验是,我(软件开发人员/维护人员)很难做到正确,但让管理员的生活变得更加美好。部分原因是我在权限 UI 中包含了查看您有权执行的操作以及为什么您有权执行此操作的功能。所以他们可以很容易地看到权限来自哪里。这对他们来说非常直观。