我想实现一个数据库驱动的访问控制系统。我一直在阅读有关 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 等)的访问。