Php 复杂的Righty系统:ACL、RBAC和其他什么?

Php 复杂的Righty系统:ACL、RBAC和其他什么?,php,security,zend-framework2,acl,rbac,Php,Security,Zend Framework2,Acl,Rbac,我们目前正在开发一个项目管理软件。我们在决定实现安全性的正确方法时遇到了困难。我们已经研究了ACL和RBAC,并且已经非常确定,出于特定的原因,我们至少需要两者的组合。但在这两个世界中都有一些问题没有很好的解决方案。让我解释一下: 假设您有以下实体: 具有不同角色的用户,即。 项目负责人 工人 管理员 项目 指定用户 项目中的任务 现在应表述以下规则: 具有工作者角色的用户只能查看与分配给他的项目相关的任务 这导致用户只能查看整个列表中的一些任务 我们将使用RBAC授予角色实际阅读任务的权限

我们目前正在开发一个项目管理软件。我们在决定实现安全性的正确方法时遇到了困难。我们已经研究了ACL和RBAC,并且已经非常确定,出于特定的原因,我们至少需要两者的组合。但在这两个世界中都有一些问题没有很好的解决方案。让我解释一下:

假设您有以下实体:

  • 具有不同角色的用户,即。
    • 项目负责人
    • 工人
    • 管理员
  • 项目
  • 指定用户
  • 项目中的任务
  • 现在应表述以下规则: 具有工作者角色的用户只能查看与分配给他的项目相关的任务

    这导致用户只能查看整个列表中的一些任务

    我们将使用RBAC授予角色实际阅读任务的权限。但由于涉及特定实体,因此不适用该条件。可以使用ACL,但我们担心让ACL条目与需求保持一致的噩梦(用户可以更改,角色可以更改,可以引入新的任务,必须获得正确的条目,这同样复杂)

    当然,在查看特定项目时可能会有特定的查询(
    其中project_id=123
    ),但这对“查看我当前的所有任务””没有帮助,因为基本上可以考虑显示每个任务,但必须检查每个Entry的ACL

    我如何确保“获取当前用户可以看到的前25个任务”,而不必从数据库加载所有任务,然后根据ACL进行过滤,即处理分页。

    好吧,我使用它漂亮的RBAC层。我不太熟悉ACL,最近也不需要

    用Yii RBAC术语来说,解决方案的关键在于使用“业务规则”。 Bizrules是附加到“权限”或“角色”(Yii术语中的“授权项”)的小代码片段。当需要确定对某个“权限”的访问权限(比方说,但也可以附加到“角色”)时,该代码会动态运行,并接收“有问题的项目”(示例中的任务)并确定是否实际访问特定任务。 下面是一个更详细的示例:

    • 假设您需要具有以下权限:
      • 编辑任务(角色为“任务管理员”的任何人都可以编辑任务)
      • 编辑自己的任务(提交此任务的人应允许编辑自己的任务)
    • 现在,在“任务编辑”代码部分,首先检查“编辑任务”权限。如果确定-允许
    • 如果不允许,还应检查“编辑自己的任务”(使用else if构造)。现在,在上面提到的权限上,应该附加一个bizrule(=php代码),它接受一个“任务”对象,并将其“创建者id”与“当前检查的用户id”进行比较。如果相等,则返回true,这意味着应该授予访问权限

    简而言之。如果您对更多内容感兴趣,请参阅官方指南的第页。还有一组其他资源,您需要。

    您需要查看ACL和RBAC,并考虑基于属性的访问控制(ABAC-见NIST指南)。Gartner将此空间称为“外部化授权管理”

    使用ABAC,您可以轻松地表达任何规则,这些规则不仅考虑用户是谁,还考虑用户想做什么、在哪里、何时、为什么以及如何做。使用属性定义授权,您可以使用XACML实现策略。是一个OASIS标准(就像SAML一样)

    使用XACML,您可以获得一个API,您可以在其中提问,例如:Alice可以查看此记录吗?但在您的情况下,这还不够,因为您希望从数据库中筛选出记录。而且,正如您所描述的,您希望查询从一开始就是正确的,而不是在拥有正确数量的授权记录之前来回访问数据库。这就是XACML变得特别有趣的地方,因为它是技术中立的。您可以将XACML应用于Java、C#和其他语言(如Python),但也可以将XACML应用于不同的层(表示、API和…数据库)。可以通过反向查询方式查询XACML以生成SQL语句,然后您可以使用该语句查询后端数据库中的相关记录:

    • Alice可以查看哪些记录
    • Alice可以查看加利福尼亚州的记录,该记录会生成“从位置为class='CA'的记录中选择*”

    HTH

    谢谢你的回答。根据我的理解,这些业务规则就是我所说的“应用程序代码中的过滤”,这并不能解决我的问题。我会做一个查询来检索任务(25),然后一些结果可能会被业务规则过滤掉。然后我需要再次调用DB并再次筛选,直到返回25个结果。在我看来,这不是很好。在我看来,我希望将业务规则应用于SQL查询,并立即检索25个结果。如果决定的话,你能说明你正在构建什么样的框架/库吗?它可以使讨论更富有成果。我们将使用ZF2。ZF2/ACL和ZfcRbac作为模块。但是我想PHP可能是错误的标签?首先,我认为使用PHP进行标签是好的,特别是在您制定了技术决策之后。我当然也会添加ZF或ZF2标签,因为有两种方法来解决这个问题——第一种是从理论方面,第二种是从技术方面。很可能是ZF社区中的某个人已经解决了类似的使用ca的问题