对于具有高度复杂访问控制规则的 Web 应用程序,您是否总是使用 ACL?

在确定我的用户的权限时,我有很多考虑因素,包括:

  • 他们登录了吗?
  • 他们是管理员还是普通用户?
  • 他们是否正在浏览图中的节点?
  • 他们浏览的是什么类型的节点?
  • 它们与节点的关系(即到节点的路径)是什么?
  • 用户的默认设置是什么?
  • 节点的默认设置是什么?
  • 连接用户和节点的图边的设置是什么?

  • 事实证明,开发 ACL 很困难。一段时间后,我诉诸于对每个 Action 顶部的基本属性进行“if/then”检查,例如if(isAdmin) {...}
    这似乎工作正常,我想知道我是否应该将它作为永久解决方案留在原地。因此,问题是:访问控制的复杂性是否会超过 ACL?或者只是我需要更努力一点?

    最佳答案

    当您的访问控制模型变得过于复杂时,因为访问不再仅基于用户的身份,您希望转移到另一个访问控制模型。

    您可以使用基于角色的访问控制 (RBAC),其中将权限分组为角色并将角色分配给用户。 Active Directory 和其他 LDAP 产品让您可以进行基于角色的访问控制。

    但是,如果您想实现的不仅仅是角色,特别是您想考虑关系、图和图边,您需要使用基于属性的访问控制 (ABAC)。在基于属性的访问控制中,您可以实现考虑用户属性(他们的角色、部门、位置、年龄、公民身份...)以及资源属性(节点在图中的位置、边......)的授权逻辑。 .) 以及节点和用户之间的关系。

    我在 ABAC 上传了一个视频:www.youtube.com/watch?v=xUEbBKnxWSo
    CERIAS 也有一些很棒的:www.youtube.com/watch?v=3ZCoupGHmwo

    目前实现 ABAC 的主要标准是 XACML,即可扩展访问控制标记语言。我会研究 XACML(免责声明 - 我为 XACML 供应商 Axiomatics 工作)。

    您可以查看供应商和开源 XACML 实现。

    使用 XACML,您最终拥有一个 if (isAuthorized()) 语句,而不是一堆 if(isAdmin) 和 if(validCitizen) 语句。实际的授权逻辑集中在用 XACML 表示的策略中。这也称为外化授权。

    关于design-patterns - 是否总是需要 ACL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15510438/

    10-10 13:56