我想实现一个数据库驱动的访问控制系统。我一直在阅读关于ACL,角色,RBAC等的内容,但似乎最常见的方案有一些主要缺点。例如,RBAC在实现细粒度访问控制时似乎很笨重(例如,允许某个角色只更新特定记录的特定列)。
如果我构建了这样的访问控制列表怎么办:
| role | table | action | columns | conditions |
| ----- | ----- | ------ | -------- | ----------------- |
| user | user | view | name, id | self.id = user.id |
| user | user | update | password | self.id = user.id |
| admin | user | update | * | |
| admin | user | create | * | |
| admin | user | delete | * | |
这个想法是,当用户尝试访问数据库时,将根据该表检查用户的角色(因此,在模型级别实现)。 action
可以是{create, view, update, delete, list}
中的任何一个。 self
范围将是引用当前用户属性的保留关键字。例如,这将允许我们仅允许用户更新自己的密码(而不是其他人的密码)。
这很健壮吗?显然,我仍然需要一个单独的列表来控制对URI等其他类型资源的访问。
答案 0 :(得分:4)
好问题。您正在达到ACL和RBAC的限制。另一种方法更灵活,称为基于属性的访问控制(ABAC)。
下图显示了访问控制随着时间的推移如何发展以迎合更复杂的方案(更多用户,更多数据,更多设备,更多上下文)。
更具体地说,您正在努力解决RBAC不支持关系的事实。然而,ABAC确实如此。 ABAC基于属性。属性只是一个键值对,例如 role == manager 或 location == Arizona 。
ABAC使用带有属性的策略来表达授权方案。例如,在ABAC中,您可以表达以下情况:
有一个名为XACML(可扩展访问控制标记语言)的标准,您可以使用它来实现ABAC。甚至有些产品专门为数据库和数据访问控制提供XACML,例如Axiomatics Data Access Filter。
如果您想了解有关ABAC的更多信息,我建议您转向2个很棒的资源: