【阅读笔记】RBAC(Role-Based Access Control)模型
使用访问控制模型的目的
所有的访问控制模型,实质上都是在解决同一个问题:“谁(User)拥有什么权限(Authority)去操作(Operation)哪些资源(Resource)。”
如果某个系统涉及成百上千的资源,又有成千上万的用户,若要为每个用户访问每个资源都分配合适的权限,必定导致巨大的操作量和极高的出错概率,这也正是RBAC所关注的问题之一。
建立访问控制模型的基本目的是管理垂直权限和水平权限。垂直权限即功能权限,譬如前面提到的审稿编辑有通过审核的权限、开发经理有代码提交的权限、出纳有从账户提取资金的权限,这一类某个角色完成某项操作的许可,都可以直接翻译为功能权限。由于实际应用与权限模型具有高度对应关系,将权限从具体的应用中抽离出来,放到通用的模型中是相对容易的,Spring Security、Apache Shiro等权限框架就是这样的抽象产物,大多数系统都能采用这些权限框架来管理功能权限。
与此相对,水平权限即数据权限,但管理起来要困难许多。譬如用户A、B都属于同一个角色,但它们各自在系统中产生的数据完全有可能是私有的,A访问或删除了B的数据也照样属于越权。一般来说,数据权限是很难抽象与通用的,仅在角色层面控制并不能满足全部业务的需要,很多时候只能具体到用户,甚至要具体管理到发生数据的某一行、某一列之上,因此数据权限基本只能由信息系统自主完成,并不存在能放之四海皆准的通用数据权限框架。
RBAC模型的思路
为了避免对每一个用户设定权限,RBAC将权限从用户身上剥离,改为绑定到“角色”(Role)上,将权限控制变为对“角色拥有操作哪些资源的许可”这个逻辑表达式的值是否为真的求解过程。
许可是抽象权限的具象化体现,权限在RBAC系统中的含义是“允许何种操作作用于哪些资源之上”,这句话的具体实例即为“许可”。
提出许可这个概念的目的其实与提出角色的目的是完全一致的,只是更为抽象。角色为的是解耦用户与权限之间的多对多关系,而许可为的是解耦操作与资源之间的多对多关系。
RBAC模型的作用
采用RBAC不仅是为了简化配置操作,还天然地满足了计算机安全中的“最小特权原则”(Least Privilege)。在RBAC模型中,角色拥有许可的数量是根据完成该角色工作职责所需的最小权限来赋予的
RBAC还允许对不同角色之间定义关联与约束关系,进一步强化它的抽象描述能力。
Spring Security也参考了(但并没有完全遵循)RBAC来设计它的访问控制功能。在Spring Security的设计里,用户和角色都可以拥有权限,譬如在它的HttpSecurity接口就同时有hasRole()和hasAuthority()方法。Spring Security的访问控制模型如下图所示
本文作者:onejay
本文链接:https://www.cnblogs.com/onejay/p/18125690
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步