![](https://csdnimg.cn/release/download_crawler_static/1455681/bg1.jpg)
rbac数据库设计:设计数据库表实现完整的
RBAC方法
疯狂代码 http://www.crazycoder.cn/ ĵ:http:/www.crazycoder.cn/DataBase/Article17465.html
如何设计数据库表实现完整的RBAC(基于角色权限控制)
RBAC(基于角色的权限控制)是一个老话题了,但是这两天我试图设计一套表结构实现完整的RBAC时,发现存
在很多困难。我说的完整的RBAC,是指支持角色树形结构和角色分组。具体来说,应当包含如下权限控制需求
:父级角色可以访问甚至是修改其子级的数据,包含直接子级直到最终子级。
角色可以访问其所在组的数据。
父级角色可以访问其所有子级(从直接子级到最终子级)所在组的数据。
而具体到我的系统中,还应当有如下需求。兼容多种数据库产品。只能用简单的表,视图,存储过程和函数等
实现。
同时兼容单条数据处理和批量数据处理的需求。
且不论这些具体需求,RBAC的基本表应当如下四个:roleList表,记录所有的角色和角色组。
roleId: PK, 角色/组的ID,全局唯一,不区分角色和组。
roleName:角色/组的名称。
roleType: R - 角色,G - 组
rolePermission表,记录每一个角色/组对每一个对象的权限。
permissionID: PK, 无特定意义。
role: 角色/组的ID。
object: 对象的ID。
permission: 权限标识,如读,写,删等。
roleRelationship表,记录角色/组之间的关系。
relationId: PK, 无特定意义。
superiorRole: 父角色/组的ID。
role:子角色,子组,成员角色,成员组的ID。
relationship: 关系标识,可在如下设置集中选取一个。
PG标识:P - 父子关系,G - 组/成员关系。
PPGG标识:在PG集上,再加三种:PP - 间接父级关系,GG - 组内组关系,CG - parentRole是组
,childRole的子角色或间接子角色是其成员,或其子组(含间接子组)的成员
objectList表,记录所有的对象。
objectId: PK,对象ID,全局唯一。
objectName: 对象名称。
... ...
分析上述表结构,不难发现,问题的关键在于从rolePermission表中读取数据时,如何限定角色/组的范围.方
案一如果角色和组的总量不大,比如在100以内,采用PPGG标识关系,读取数据时是最快的。这个时候的
SQL只需要一个输入参数?roleId:SELECT object FROM rolePermission p left join roleRelationship r