【问题标题】:ACL modeling - how to manage "hierarchy" of an Access control list?ACL 建模 - 如何管理访问控制列表的“层次结构”?
【发布时间】:2012-06-30 03:23:32
【问题描述】:

我仍在处理我的 ACL 项目,我想对以下问题提出一些想法:

我正在使用 MySQL 来存储我的用户、角色和权限。起初,我在我的 TABLE Roles 中创建了一个字段“parent_id”,并试图通过它来管理每个用户的权限。这是一种工作,直到我意识到如果我添加一个新角色,管理层次结构和控制谁可以访问哪个资源真的很复杂。我做了一些搜索,发现使用关系数据库处理层次结构非常复杂,所以我放弃了使用层次结构。

我希望您能帮助我找到管理用户创建的最佳解决方案: 我有 4 个不同的用户:SuperAdmin、CustomerAdmin、技术员、客户。 当我在页面中创建新用户时,我不想让技术人员创建类型为 CustomerAdmin 或 SuperAdmin 的新用户。

我想只让超级管理员创建新用户,但我的一个限制是我必须让客户管理员也创建用户,同时也是技术人员。

为了更具指导性,SuperAdmin 可以是我。客户管理员是我的客户,他有一个企业。在他的企业中,他可以创建两种类型的用户:技术人员和客户。

这只是一个例子,但如果我想创建一种新的角色赋予他新的权限,我必须想办法拒绝他创建一个比他更强大的用户的权限。

我不确定我的问题是否客观,但欢迎任何可以与我讨论这个问题的人。

【问题讨论】:

  • 在关系数据库中根据树的性质对树进行建模真的很困难,只是不太适合在单个查询中对数据结构进行建模以进行检索。我之前在 PostgreSQL 中使用所谓的物化路径完成了此操作,但我的实现使用了 MySQL 缺乏的一些功能。我使用了所谓的物化路径,并使用可写视图 + ltree 实现了它。使用 MySQL 做到这一点的最佳方法可能是提取数据并通过遍历数据来构建树,尽管在 PHP 中构建树数据结构有点让我不寒而栗。
  • 我明白了你的想法..但我真的必须找到一种最简单的方法来解决这个问题..它不应该是这个怪物

标签: php acl user-permissions database-permissions


【解决方案1】:

如果您使用权限值类型方案,其中数字表示权限“级别”,并且在某些增量时您获得某些权限,该怎么办?

例如

超级管理员 10000 客户管理员 1000 技术员 100 苦工 10

可以阅读 = 10 可以写设置 = 100 可创建用户 1000 个

如果某个操作的目标用户的权限号高于执行该操作的用户,则拒绝该操作。这是一种相当简单的方法来抽象这些含义,而无需构建物化路径并且必须构建树数据结构。

【讨论】:

  • 这可能是一个有趣的想法(我想说,与我所想的一切不同),但问题是我使用的是 Zend_Acl(没有插件,因为我必须使用个性化的MVC 框架),以及我检查用户是否被允许的函数,获取角色 ID、资源和权限),并在数据库中验证,如果我的 ACL_Role 表中有注册表:role_id = 5,Resource_id = 2,权限 = 阅读,我检查:检查(5,2,阅读)。如果没问题,则返回 1,否则返回 0。我认为按照您的想法,我将无法继续使用我的 ACL。 (我可能错了)。
  • 您可能必须自定义现有的 ACL 解决方案才能使用这些方面的东西。我认为要做到这一点,无论如何你都需要对其进行自定义。您可以为每个现有角色定义角色级别,然后只进行数字比较,而不是使用它来定义整个系统,这样就需要对您正在使用的内容进行较少的修改。
【解决方案2】:

您已经拥有自己的角色,但每个角色都需要拥有执行操作的权限。这几乎可以肯定是矫枉过正,但它应该非常灵活。

|角色表 | |角色 ID |角色名称 |访问级别 | -------------------------------------- | 1 |超级管理员 | 10 | | 2 |客户管理 | 20 | | 3 |技术员 | 40 | | 4 |客户 | 80 | |行动表 | |操作 ID |动作名称 | -------------------------- | 1 |创建用户 | | 2 |删除用户 | 等等。 |权限表 | |正确的 ID |角色 ID |操作 ID | ---------------------------------- | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 1 | | 4 | 2 | 2 | 等等。 |参数表 | |参数 ID |正确的 ID |参数名称 |参数值 | -------------------------------------------------- --------- | 1 | 1 |最大用户访问权限 | 10 | | 2 | 2 |最大用户访问权限 | 10 | | 3 | 3 |最大用户访问权限 | 20 | | 4 | 4 |最大用户访问权限 | 20 | 等等。

Rights 表显示 SuperAdmin 和 ClientAdmin 都可以创建和删除用户。参数表将 ClientAdmin 限制为创建最大访问级别为 20(1 为最高)的用户。您可以将此访问级别与角色匹配,以便为 Role.Access_Level >= Max User Access 的新用户提供角色列表。

根据权利,动作可以使用多个参数集,但我想不出除了 Max User Access 之外的其他任何东西。

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2011-10-15
    • 2013-11-24
    • 2018-09-05
    • 1970-01-01
    • 2016-03-27
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多