1. RBAC(角色)
目前,接受度较高的功能权限模型是RBAC(Role-Based Access Control)模型。模型中有几个关键的术语:
- 用户:系统接口及访问的操作者
- 角色:具有一类相同操作权限的用户的总称
- 权限:能够访问某接口或者做某操作的授权资格
- 用户与角色可为多对一或多对多的关系,当一个用户的角色为多对多时,当前用户的权限是多个角色的并集。
- 此时只需要为角色赋予权限,能够大大减轻管理负担,同时将用户与权限解耦,提供更大的灵活性,同时整个设计的容错能力也提高了很多。
1 | /** |
2. 其他权限模型
ACL 最简单,ABAC 最复杂,但是功能最强大,也最灵活。RBAC 则介于二者之间。
2.1 ACL(Access Control List)
用户 -> 权限
权限能直接赋予用户,例如将查看订单列表(权限)赋予某位运营人员(用户)。
但是这种模式的缺点在于,但用户量达到一定量级的时候,那么就需要对每个用户都进行一次授权操作,那么这个工作量就会相当大。
2.2 ABAC(Attribute-Based Access Control)
ABAC模型通常是基于用户的属性(如身份、地点、时间等)和资源属性(如文件类型、敏感度等)进行判断的。你甚至可以把角色理解为该用户的一个属性,这些模型之间本身就不是互斥的,最终还是为了方便管理权限而来,所以灵活使用即可。
值得注意的是,ABAC模型一般是基于已有的一些属性来进行的权限划分,而RBAC模型则是在人为重新设置了几个角色来管理权限。
应用场景
在 ABAC 权限模型下,你可以轻松地实现以下权限控制逻辑:
- 授权 A 具体某部门的编辑权限;
- 当一个文档的所属部门跟用户的部门相同时,用户可以访问这个文档;
- 当用户是一个文档的拥有者并且文档的状态是草稿,用户可以编辑这个文档;
- 早上九点前禁止 A 部门的人访问 B 系统;
- 在除了上海以外的地方禁止以管理员身份访问 A 系统;
上述的逻辑中有几个共同点:
- 具体到某一个而不是某一类资源;
- 具体到某一个操作;
- 能通过请求的上下文(如时间、地理位置、资源 Tag)动态执行策略;
如果浓缩到一句话,你可以 细粒度地授权在何种情况下对某个资源具备某个特定的权限。