我已经制作了实现这个定制的 ACL 系统所需的数据库和 php 代码。现在我必须“授权”当前用户,这就是我需要你建议的地方。
该系统基于对系统用户和系统模块的灵活权限分配。它还有一些预定义的,比如说用户组,也可以创建完全自定义的组。全局规则也可以应用在 ACL 之上,但它的优先级低于分配权限的组或用户。
为了更好地描绘它:
预定义组:
- 有限(禁止访问)
- 基本用户
- 高级用户
- 行政人员
- 访客(定制组的样本)
以下是访问级别(名称/值对):
- 不允许 / 0
- 允许 / 1
- 否认 / 2
- 如果所有者允许 / 3
注意:“允许”在“禁止”上具有更高的优先级,所以如果您在 A 组上让用户 X 被“禁止”,但在某个访问权限上 B 组“允许”,那么他最终会“允许”。另一方面,如果用户 X 通过成为“管理员”组的成员而具有“完全访问权限”,但如果他只是在某个访问权限上“拒绝”,则他最终没有访问权限,这意味着“拒绝” “允许”具有更高的优先级。
在顶层,您可能有以下内容:
- "Administrator" * "1",表示管理员拥有系统的完全访问权限
- "Visitors" * "0",这意味着访客不允许在任何东西上
我的问题是如何处理这些支票?假设我们有一个简单的授权机制。我们会在我们的$_SESSION['user']
like$_SESSION['user']['login'] = true;
和中有一些索引$_SESSION['user']['id'] = $row['user_id']
,对吧?
现在,如果你想在你的脚本上实现这个机制,你会怎么做?
我可能会首先检查全局访问规则。然后我会看看用户是否已经登录。如果是,只需获取他的所有组,然后查看权限表以查看哪些权限分配给了他的组和他的用户 ID,然后将它们存储在用户会话中。然后,当模块说这是我运行所需的权限时,我会查看用户是否有足够的权限访问所请求的模块。
看起来相当复杂!非常感谢任何帮助或建议!:)
编辑:
我没有使用任何框架。其实我用过,不过是我自己的。所以,这里没有预制的 ACL!
更新:
您对优先考虑(覆盖/替换?)ACL 的有效方法有任何想法吗?
Deny
是最高的,然后Allow
是Disallow
。分配的 ACL也是User
最高的,然后是Group
ACL,最后是Global
ACL。
这是我最终想到的:
有一个Array
,像这样:
$_SESSION['ACL'][$module][$action] = $access_level; // 0, 1, 2, 3
首先,我会查找所有 Global Rules *
,并将它们放在数组中:
// The current user can see the map, applied by a global rule
$_SESSION['ACL']['map']['render'] = 1;
// All the other permissions are disallowed by default
$_SESSION['ACL']['*']['*'] = 0;
// He can edit his preferences, (Owner)
$_SESSION['ACL']['user']['*'] = 3;
然后,我将寻找基于组的 ACL:
// User could access the Analyze module, all the methods
// with Permission Name "report". Applied by being a member
// of "Moderator" Group
$_SESSION['ACL']['analyze']['report'] = 1;
// User NOT allowed to access "groups" module, let say
// it reserved for "admin" group! - To see the ACLs' Overwriting!
$_SESSION['ACL']['groups']['*'] = 0;
毕竟,我会寻找用户分配的 ACL:
// User have Full Access to the "groups" module.
// It's gonna replace the last ACL, applied by "Moderator" group
// Note that the order of processing ACLs is IMPORTANT!
$_SESSION['ACL']['groups']['*'] = 1;
我想它会完美运行,有什么想法吗?
它现在工作得很好:)