如何设计数据库表实现完整的rbac(基于角色权限控制)

如何设计数据库表实现完整的rbac(基于角色权限控制)

ID:15081046

大小:25.50 KB

页数:3页

时间:2018-08-01

如何设计数据库表实现完整的rbac(基于角色权限控制)_第1页
如何设计数据库表实现完整的rbac(基于角色权限控制)_第2页
如何设计数据库表实现完整的rbac(基于角色权限控制)_第3页
资源描述:

《如何设计数据库表实现完整的rbac(基于角色权限控制)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、如何设计数据库表实现完整的RBAC(基于角色权限控制).txt你看得见我打在屏幕上的字,却看不到我掉在键盘上的泪!自己选择45°仰视别人,就休怪他人135°俯视着看你。如何设计数据库表实现完整的RBAC(基于角色权限控制)[转]2007-11-0414:15RBAC(基于角色的权限控制)是一个老话题了,但是这两天我试图设计一套表结构实现完整的RBAC时,发现存在很多困难。我说的完整的RBAC,是指支持角色树形结构和角色分组。具体来说,应当包含如下权限控制需求:父级角色可以访问甚至是修改其子级的数据,包含直接子级直到最终子级。角色可以访问其

2、所在组的数据。父级角色可以访问其所有子级(从直接子级到最终子级)所在组的数据。而具体到我的系统中,还应当有如下需求。兼容多种数据库产品。只能用简单的表,视图,存储过程和函数等实现。同时兼容单条数据处理和批量数据处理的需求。且不论这些具体需求,RBAC的基本表应当如下四个:roleList表,记录所有的角色和角色组。roleId:PK,角色/组的ID,全局唯一,不区分角色和组。roleName:角色/组的名称。roleType:R-角色,G-组rolePermission表,记录每一个角色/组对每一个对象的权限。permissionID:P

3、K,无特定意义。role:角色/组的ID。object:对象的ID。permission:权限标识,如读,写,删等。roleRelationship表,记录角色/组之间的关系。relationId:PK,无特定意义。superiorRole:父角色/组的ID。role:子角色,子组,成员角色,成员组的ID。relationship:关系标识,可在如下设置集中选取一个。PG标识:P-父子关系,G-组/成员关系。PPGG标识:在PG集上,再加三种:PP-间接父级关系,GG-组内组关系,CG-parentRole是组,childRole的子角色

4、或间接子角色是其成员,或其子组(含间接子组)的成员objectList表,记录所有的对象。objectId:PK,对象ID,全局唯一。objectName:对象名称。......分析上述表结构,不难发现,问题的关键在于从rolePermission表中读取数据时,如何限定角色/组的范围.方案一如果角色和组的总量不大,比如在100以内,采用PPGG标识关系,读取数据时是最快的。这个时候的SQL只需要一个输入参数?roleId:SELECTobjectFROMrolePermissionpleftjoinroleRelationshipron

5、p.role=r.roleWHEREp.role=?roleIdorr.superiorRole=?roleId.(尚未验证SQL的正确性)但是,这个方案是以极度冗余roleRelationship表的数据为代价的,比如有100个角色,那么roleRelationship中将会有100*100=10,000条记录。而在每次调整角色和R角色组的时候,就要在roleRelationship中一次增加或删除100条记录。这个开销是比较大的。方案二只标识PG,查询时接收的输入参数为一个完整的相关角色列表?roleList。SELECTobject

6、FROMrolePermissionWHERErolein(?roleList)在系统运行时,这个?roleList通常可以从rolehierarchycache中取到,比较方便。这个方案的主要问题有二:1)如果?roleList过长,使用in判断性能会很差。2)在有些情况下,如报表查询和系统外查询时,取得roleList不太方便。方案三只标识PG,但使用如下三个数据库函数来判断角色/组之间的关系。booleanisChild(role,parentRole)-如role为parentRole的子,返回true。booleanisDesc

7、endant(role,ancestorRole)-如role为ancestorRole的子或间接子级,返回true。booleanisMember(role,group)-如role为group的成员或子组的成员,返回true。booleandescendantIsMember(role,group)-如role的子或间接子级为group的成员,返回true。booleanisBelong(role,super)-如role为super的子,间接子,成员或间接员,或者role的子(含间接子)是super的成员或子组成员,返回true。在

8、查询时,也只需要接收一个?roleId:SELECTobjectFROMrolePemissionWHEREisBelong(?roleId,role)如何写出高性能的数据库函数是实现这个方法

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。