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

待挥别时 分享 2021-06-01 下载文档

高中物理教学艺术

rolePermission WHERE role in (?roleList)

在系统运行时,这个?roleList通常可以从role hierarchy cache中取到,比较方便。这个方案的主要问题有二:

1)如果?roleList过长,使用in判断性能会很差。

2)在有些情况下,如报表查询和系统外查询时,取得roleList不太方便。

方案三

只标识PG,但使用如下三个数据库函数来判断角色/组之间的关系。

boolean isChild(role, parentRole) - 如role为parentRole的子,返回true。
boolean isDescendant(role, ancestorRole) - 如role为ancestorRole的子或间接子级,返回true。
boolean isMember(role, group) - 如role为group的成员或子组的成员,返回true。
boolean descendantIsMember(role, group) - 如role的子或间接子级为group的成员,返回true。
boolean isBelong(role, super) - 如role为super的子,间接子,成员或间接员,或者role的子(含间接子)是super的成员或子组成员,返回true。
在查询时,也只需要接收一个?roleId:SELECT object FROM rolePemission WHERE isBelong(?roleId, role)

如何写出高性能的数据库函数是实现这个方法的关键。

上述方法仅是理论分析,我倾向于方案二。

终于想到新的方案了。

方案四,

结合方案一和方案二,在roleRelationship中,对前两级(也可以是三级或四级)角色,保存其所有的下级角色和组。这样,如果以前两级角色查询数据,就使用方案一,如果以第三级及以下的角色查询数据,就使用方案二。

仍以100个角色为例,每个角色要保存三个关系:一级主管角色,二级主管角色,直接主管角色,最多有300条数据。

每往角色组中加一个角色,也需要加入三条数据:角色本身,一级主管角色,二级主管角色。

但往角色组中加一个子组,需要加入的数据量就大一些:子组本身,子组所有角色,子组所有角色的一级主管角色和二级主管角色。如在多个子组中发现同一角色,可重复保存,但应在表中附加说
明是由哪个子组导入的。这样在删除子组时就可以有选择性的删除。

但重复子组的情况就比较麻烦,还有等考虑。假充有组g01,g11,g12,g21。g01包含g11和g12,g11和g12分别包含g21。从g01中删除g11时,如何判断g21的去留?看来还是应当在维护时判断应不应当删除。


如何设计数据库表实现完整的RBAC(基于角色权限控制)(2).doc 将本文的Word文档下载到电脑

下一篇:矿山压力及岩层控制

相关推荐
相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xxxxxx QQ:xxxxxx