基于角色的权限访问控制RBAC(role-based access control)是以角色为中心进行的访问控制,也就是判断主体subject是那个角色的方式进行权限访问控制,是粗粒度的
基于资源的权限访问控制RBAC(resource-based access control)是以资源为中心进行的访问控制,只需要为角色添加权限就可以
区别:
由于基于角色的权限访问控制的角色与权限往往是多对多的关系(比如admin角色可以所有CURD的权限,部门经理角色有Retrieve权限,这就是多对多关系了),如果角色所对应的权限发生变化 ,那我们所编写的判断逻辑就必须发生改变,可扩展性差
比如:原本只有admin可以访问,那么判断可以这么写
if(role.equals(”admin”)){
//retrieve
}
但是假设后期需要给部门经理角色也赋予retrieve权限,那么必须改变原有代码,或者另外增加代码,总之要改变原有的判断逻辑
if(role.equals("admin") || role.equals("manager")){
//retrieve
}
如果是基于资源的权限访问控制,资源和权限一对一关系比较常见,很多时候资源和权限在数据库中会被合并在一张表中,只需要为资源分配相应的权限。所以一个具体操作对应的权限,只要直接判断用户是否拥有该权限即可,可扩展性强
//判断用户是否具有查看权限,用户的角色可以任意变化,而这条判断语句始终是可行的
if(user.hasPermission("retrieve")){
//retrieve
}
如果用户的权限需要改变,只需要对数据库中用户的角色对应的权限进行改变,而权限与对应资源通常不会有改变的需求
不过使用基于资源的方式,仍然是需要角色的,用户的权限分配的依据往往是角色(比如:如果我给你admin角色,那么同时也会给你curd的权限)。而进行访问控制时,则不依赖角色(比如:你想查看 ,那么我可以直接问你你有retrieve权限吗?如果有,你就可以访问。而不关心你是什么角色)。