我已经制作好了实现定制化ACL系统所需的数据库和php代码。现在我需要“授权”当前用户,这就是我需要你的建议的地方。
该系统基于灵活的权限分配,既可以分配给系统用户,也可以分配给系统模块。它还具有一些预定义的用户组,例如用户可以完全自定义组。全局规则也可以应用于ACL之上,但其优先级最低,低于分配权限的组或用户。
为了更好地说明:
预定义组:
1.受限制(无访问权限) 2.基本用户 3.高级用户 4.管理员 5.访客(自定义组的示例)
以下是访问级别(名称/值对):
1.拒绝/0 2.允许/1 3.否决/2 4.如果所有者允许/3
注意:“允许”优先于“拒绝”,因此如果您在某个访问中将用户X“禁止”在A组中,但在B组中“允许”,那么他最终会被“允许”。另一方面,如果用户X通过成为“管理员”组的成员获得“完全访问权限”,但是如果他仅在某个访问上被“拒绝”,那么他最终没有访问权限,这意味着“否决”优先于“允许”。
在顶层,您可以拥有以下内容:
1. “管理员”*“1”,这意味着管理员对系统具有完全访问权限 2. “访客”*“0”,这意味着访客不被允许使用任何功能
我的问题是如何处理这些检查?想象一下我们有一个简单的授权机制。我们将在$_SESSION ['user']中拥有一些索引,例如$_SESSION ['user'] ['login'] = true;和$_SESSION ['user'] ['id'] = $ row ['user_id'],对吗?
现在,如果您想要在脚本中实现此机制,您会如何做?
首先我可能会检查全局访问规则。然后我会查看用户是否已经登录。如果是,则只需获取他的所有组,然后查看权限表以查看哪些权限分配给了他的组和用户ID,然后将它们存储在用户会话中。然后,当模块说这是我需要运行的权限时,我会查看用户是否具有请求模块所需的足够访问权限。
看起来相当复杂!非常感谢您提供任何帮助或建议! :)
编辑:
我没有使用任何框架。实际上,我使用了自己的框架。因此,这里没有预先制作的ACL!
更新:
您有关于优先(覆盖/替换?)ACL的有效方法吗?
毕竟,我正在寻找用户分配的ACL:
该系统基于灵活的权限分配,既可以分配给系统用户,也可以分配给系统模块。它还具有一些预定义的用户组,例如用户可以完全自定义组。全局规则也可以应用于ACL之上,但其优先级最低,低于分配权限的组或用户。
为了更好地说明:
预定义组:
1.受限制(无访问权限) 2.基本用户 3.高级用户 4.管理员 5.访客(自定义组的示例)
以下是访问级别(名称/值对):
1.拒绝/0 2.允许/1 3.否决/2 4.如果所有者允许/3
注意:“允许”优先于“拒绝”,因此如果您在某个访问中将用户X“禁止”在A组中,但在B组中“允许”,那么他最终会被“允许”。另一方面,如果用户X通过成为“管理员”组的成员获得“完全访问权限”,但是如果他仅在某个访问上被“拒绝”,那么他最终没有访问权限,这意味着“否决”优先于“允许”。
在顶层,您可以拥有以下内容:
1. “管理员”*“1”,这意味着管理员对系统具有完全访问权限 2. “访客”*“0”,这意味着访客不被允许使用任何功能
我的问题是如何处理这些检查?想象一下我们有一个简单的授权机制。我们将在$_SESSION ['user']中拥有一些索引,例如$_SESSION ['user'] ['login'] = true;和$_SESSION ['user'] ['id'] = $ row ['user_id'],对吗?
现在,如果您想要在脚本中实现此机制,您会如何做?
首先我可能会检查全局访问规则。然后我会查看用户是否已经登录。如果是,则只需获取他的所有组,然后查看权限表以查看哪些权限分配给了他的组和用户ID,然后将它们存储在用户会话中。然后,当模块说这是我需要运行的权限时,我会查看用户是否具有请求模块所需的足够访问权限。
看起来相当复杂!非常感谢您提供任何帮助或建议! :)
编辑:
我没有使用任何框架。实际上,我使用了自己的框架。因此,这里没有预先制作的ACL!
更新:
您有关于优先(覆盖/替换?)ACL的有效方法吗?
Deny
最高,其次是Allow
和Disallow
。此外,用户分配的ACL优先级最高,然后是组ACL,最后是全局ACL。
最终我得出了以下结论:
这里有一个像这样的Array
:
$_SESSION['ACL'][$module][$action] = $access_level; // 0, 1, 2, 3
首先,我会查找所有全局规则*
,并将它们放入数组中:
// 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;
我认为它将完美地工作,有什么想法吗?
现在它运行得非常好 :)