4

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

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

为了更好地描绘它:

预定义组:

  1. 有限(禁止访问)
  2. 基本用户
  3. 高级用户
  4. 行政人员
  5. 访客(定制组的样本)

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

  • 不允许 / 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是最高的,然后AllowDisallow。分配的 ACL也是User最高的,然后是GroupACL,最后是GlobalACL。

这是我最终想到的:

有一个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;

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

它现在工作得很好:)

4

2 回答 2

2

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

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

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

于 2012-09-11T13:39:30.900 回答
1

只需创建您的权限/组表:

id, group/permission name

然后,创建多对多表将组链接到用户:

id, user_id, group_id

如果您只是使用组权限,则不需要访问级别。

然后,在您的代码中,只需像这样检查用户组:

function checkAccess($pageLevelRequired)
{
  // run query based on current user session id
  // run your query to check if the current user belongs to the group required to view this page.
}

说得通?

于 2012-09-11T13:01:56.687 回答