gpt4 book ai didi

PHP 复杂的基于角色的访问控制列表

转载 作者:可可西里 更新时间:2023-10-31 23:23:01 24 4
gpt4 key购买 nike

我已经制作了实现这个自定义ACL系统所需的数据库和php代码。现在我必须“授权”当前用户,这就是我需要您的建议的地方。

该系统基于对系统用户和系统模块的灵活权限分配。它也有一些预定义的,比方说用户组,还能够创建完全自定义的组。全局规则也可以应用在 ACL 之上,但它的优先级最低,高于分配给组或用户的权限。

为了更好地描绘它:

预定义组:

  1. 受限(无访问权限)
  2. 基本用户
  3. super 用户
  4. 管理员
  5. 访问者(自定义组的样本)

以下是访问级别(名称/值对):

  • 不允许/0
  • 允许/1
  • 拒绝/2
  • 如果所有者/3允许

注意:“允许”在“禁止”上具有更高的优先级,因此如果您的用户 X 在 A 组上处于“不允许”状态,但在特定访问权限上对 B 组处于“允许”状态,那么他最终将处于“允许”状态。另一方面,如果用户 X 通过成为“管理员”组的成员而具有“完全访问权限”,但如果他只是对某个访问权限“拒绝”,则他最后没有访问权限,这意味着“拒绝”在“允许”上具有更高的优先级。

在顶层你可能有这样的东西:

  • "Administrator"* "1",表示管理员对系统具有完全访问权限
  • “访客”*“0”,这意味着访客不允许进行任何操作

我的问题是如何处理这类支票?想象一下我们有一个简单的授权机制。我们将在我们的 $_SESSION['user'] 中有一些索引,例如 $_SESSION['user']['login'] = true;$_SESSION ['user']['id'] = $row['user_id'],对吧?

现在,如果您想在脚本中实现这种机制,您将如何实现?

我可能会首先检查全局访问规则。然后我会查看用户是否已经登录。如果是,只需获取他的所有组,然后查看权限表以查看分配给他的组和用户 ID 的权限,然后将它们存储在用户 session 中。然后当模块说这是我需要的运行权限时,我会查看用户是否有足够的权限访问请求的模块。

看起来很复杂!非常感谢任何帮助或建议! :)

编辑:

我没有使用任何框架。其实我用,但它是我自己的。所以,这里没有预制的 ACL!

更新:

您是否知道一种有效的方法来确定(覆盖/替换?)ACL 的优先级?

Deny 最高,然后是 Allow,然后是 Disallow。此外,User 分配的 ACL 最高,然后是 Group ACL,最后是 Global ACL。

这是我最后想出的:

有一个数组,像这样:

$_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;

我想它会很完美,有什么想法吗?

它现在工作得很好:)

最佳答案

下面是我在MVC环境下的处理方式,创建一个具有这种结构的表:

(id, group_id(int), user_id(int), controller(varchar), action(varchar)) 

然后我在组和 user_id 上使用 -1 来表示通配符,在 Controller 和操作上使用 *。因此,在您的示例中,管理员可以执行任何操作 (1,4,-1,,)。或者假设 Power Users 可以修改用户 (2,3,-1,user,*)。或者如果你想给一个人(user_id 为 34)一个权限,不管他们在哪个组(3,-1,34,user,update)。如果你想存储你的 0-3 允许,禁止,只需添加一列。然后,您只需检查正在调用哪个 Controller 和操作,并找到适用于此人的组以及具体适用于他们的任何权限。

关于PHP 复杂的基于角色的访问控制列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com