pdo*_*eit 6 php security acl rbac zend-framework2
我们目前正在开发一个项目管理软件.我们无法确定实施安全性的正确方法.我们已经查看了ACL和RBAC,并且已经非常确定我们至少需要两者的组合才能出于特定原因.但是有两个问题在这两个世界都没有很好的解决方案.让我解释:
假设您有以下实体:
现在应该表达以下规则:只允许具有角色工作者的用户查看与分配给他的项目相关的任务.
这导致仅允许用户查看整个列表中的一些任务.
我们将使用RBAC为Roles提供实际读取任务的权限.但由于涉及特定实体,因此不适用该条件.可以使用ACL,但我们担心保持ACL条目符合要求的噩梦(用户可以更改,角色可以更改,可以引入新任务,必须获得正确的条目,这同样复杂).
当然,在查看特定项目时可能会有特定的查询(WHERE project_id = 123),但这对"我所有当前任务的视图"没有帮助,基本上每个任务都可以考虑显示,但是必须检查ACL每一个人.
我如何确保诸如"获取当前用户可以看到的前25个任务"之类的内容,而无需从数据库加载所有任务,然后根据ACL进行过滤,即处理分页.
您需要超越 ACL 和 RBAC 并考虑基于属性的访问控制(ABAC - 请参阅此处的 NIST 指南)。Gartner 将此空间称为“外部化授权管理”。
使用ABAC,您可以轻松地表达任何规则,不仅考虑用户是谁,还考虑用户想要做什么、在哪里、何时、为什么以及如何做。使用属性来定义授权,您可以使用XACML来实施策略。XACML是 OASIS 标准(就像 SAML)。
通过 XACML,您可以获得一个 API,您可以在其中提出问题,例如:Alice 可以查看此记录吗?但就您而言,这还不够,因为您想从数据库中过滤掉记录。而且,正如您所描述的,您希望查询从一开始就是正确的,而不是在数据库中来回查找,直到获得正确数量的授权记录为止。这就是 XACML 变得特别有趣的地方,因为它是技术中立的。您可以将 XACML 应用于 Java、C# 和其他语言(例如 Python),还可以将 XACML 应用于不同的层(表示、API 和...数据库)。可以通过反向查询方式查询 XACML 以生成 SQL 语句,然后您可以使用该 SQL 语句来查询后端数据库以获取相关记录:
华泰
嗯,我使用Yii 框架及其漂亮的 RBAC 层。我最近对 ACL 不太熟悉,也不需要太熟悉。
用 Yii RBAC 术语来说,解决方案的关键是使用“业务规则”。Bizrule 是附加到“权限”或“角色”(Yii 术语中的“授权项”)的小代码片段。当需要确定对某个“权限”的访问(可以说,但它也可以附加到“角色”)时,此代码会动态运行,并且它会收到“有问题的项目”(示例中的任务)并且确定是否实际访问特定任务。这是一个更详细的示例:
简而言之。如果您有更多兴趣,请参阅官方指南的这一部分。如果您需要的话,还有很多其他资源。