当前位置 : 主页 > 编程语言 > java >

自定义RBAC(3)

来源:互联网 收集:自由互联 发布时间:2022-12-23
您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~ RBAC类型的权限,本质上是一种对资源访问路径的控制,且具有典型的树型层次结构。而树型结构,天然地就有父结点和子

您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~

RBAC类型的权限,本质上是一种对资源访问路径的控制,且具有典型的树型层次结构。而树型结构,天然地就有父结点和子结点的关系以及区别。就像前面展示过的业务系统的树型结构:

自定义RBAC(3)_权限系统

从我个人的开发经验来看,在大多数情况下,数据库的权限表可以这样设计:

自定义RBAC(3)_RBAC_02

这也算是抛砖引玉吧。

和普通的表结构一样,将主键设为自增编码。这种方式的优点是便于操作和实现。

缺点是在设计数据库表结构时不便于观察各节点之间的联系,因此就出现了一种能够让主键携带更多信息的编码方式:

自定义RBAC(3)_Java_03

其实我们每个人的身份证就是一种最常见的「占位符」编码,例如「420」开头的身份证就都是湖北省的。

利用编码中的占位符来代替单纯的数字这么做的底层逻辑是:

1、所有层级为「1」的大类按照自然数的编码顺序依次递增

2、所有编码,都从「1」开始计数,如1、1010000、1010100、2010000

3、从层级为2的权限开始,编码为7位数,例如:1010000

4、编码第一位(1):占位符,表示业务编号,与大类的业务编码对应,每个占位符都可能有99个直接子类

5、编码第二、三位(01):表示层级为3的儿子权限,从01~99,可以有99个儿子

6、编码第四、五位(00):表示层级为4的孙子权限,从01~99,可以有99个孙子

7、编码第六、七位(00):表示层级为5的曾孙权限,从01~99,可以有99个曾孙

这种编号方式能很清晰地看出层级结构,但如果需要无限扩展层级结构时就无能为力。自增方式可以很方便地实现无限扩展,但编号却毫无规律,不容易看出层级关联。

所以,如果层级不多,建议使用占位符方式,反之利用自增方式。一般来说权限数据相对比较固定,极少改动,因此可以使用MyISAM的存储引擎,且事先可以以初始化的方式创建较为完整的权限数据。

从上面的过程可以看出来,权限设计其实是一件比较抽象的思考活动。有时候一些复杂的权限、角色、组织、用户等内容交织在一起,会让人觉得无从下手。其实只要通过适当的方法来解构,就可以更好地理解了。例如:“汉堡包”法。

顾名思义,就是能像汉堡包那样直观、清晰地了解权限系统所包括的内容。

自定义RBAC(3)_Java_04

“汉堡包”上层的组织结构可能是这样的:

自定义RBAC(3)_RBAC_05

“汉堡包”下层的权限集合则可能是这样的:

自定义RBAC(3)_权限系统_06

而汉堡包中间的分组&角色则可能又是这样的:

自定义RBAC(3)_RBAC_07

如果要搞权限叠加的话,嗯~~~,是这样的:

自定义RBAC(3)_RBAC_08

这里把和权限进行连线的图省略掉了,因为实在是太~过~复~杂~了~~,完全不是人看的玩意。

所以呢,对于刚开始接触权限系统的初学者,也不要被吓到了,完全可以通过这种方式进行思维训练,来一步步熟悉:

1、先明确委托方的组织架构图,设计出上层汉堡包

2、再依据业务需求细化出系统的功能权限,设计出下层汉堡包

3、结合业务要求,再在中间填充各类角色及分组

4、最后将它们用线条关联起来

5、熟练以后,就不用再在纸上或者绘图软件中画出来

6、只需在脑子里就可以勾勒出来整个权限系统的轮廓了

可能有些同学会有一个疑问:为什么在parentids字段中的值,结尾都要加个「,」?

答案就在执行SQL时。

例如,查找id=1的所有子类

有「,」:SELECT * FROM sys_permission WHERE parentids LIKE '%1,%'

无「,」:SELECT * FROM sys_permission WHERE parentids LIKE '%1%'

可以比较一下查询结果会有什么不同。

当然,互联网的业务的MySQL中是不允许出现LIKE查询的,这一点多插一句嘴。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

上一篇:SpringBoot Actuator未授权访问漏洞修复
下一篇:没有了
网友评论