关于 RBAC 设计优化的问题

2021-09-14 16:09:45 +08:00
 LotteWong

采用常见的五表法实现 RBAC 模块( user 、role 、permission 、user-role 、role-permission ),leader 表示每次鉴权都要:user → user-role → role → role-permission → permission,这样做的复杂度略高。现在想了两种方案优化:

  1. 联表查询。存在的问题:因为这个 RBAC 模块同时需要适配 MySQL 和 MongoDB,MySQL 还好处理,MongoDB 的聚合查询有点复杂而且性能不佳。
  2. 加新的表 user-permission 。存在的问题:当用户绑定角色 or 角色绑定权限时,每次都要更新 user-permission 表,写的消耗很大,而且有很多的冗余数据。

请问 uu 们有没有其它更好的优化方法呀?

1702 次点击
所在节点    数据库
15 条回复
JaguarJack
2021-09-14 16:12:13 +08:00
对于后台而言,一般都是查多写少。一般都是缓存
LotteWong
2021-09-14 16:15:37 +08:00
@JaguarJack 现在因为业务限制估计用不了 Redis 之类的,第二种方法有点类似缓存的意思。
aragakiyuii
2021-09-14 16:26:39 +08:00
单机的?
fgwmlhdkkkw
2021-09-14 16:26:39 +08:00
1,role,permission,role-permission 这三个表的信息与用户无关,可以全加载到内存中,最终生成 {role=>permissions}。
2,通过 user-role 读取每个用户的角色列表,然后做{roles => permissions}的 cache 。
fgwmlhdkkkw
2021-09-14 16:27:09 +08:00
@fgwmlhdkkkw #4 permissions 可以用 bitmap
afirefish
2021-09-14 16:50:58 +08:00
4 楼正解,如果采用的 jwt 认证的话,省至可以省去查询 user 表。弊端就是无法做到用户禁用后马上不能登录。
learningman
2021-09-14 17:29:18 +08:00
全读内存里呗。。。
jorneyr
2021-09-14 18:31:55 +08:00
加新的表 user-permission 。存在的问题:当用户绑定角色 or 角色绑定权限时,每次都要更新 user-permission 表,写的消耗很大,而且有很多的冗余数据。

这个就很好,写能有多大消耗?
权限更新是一个低频操作,难不成你们的系统没事就高并发改权限吗?
wqtacc
2021-09-14 22:57:43 +08:00
鉴权的话,这套模型没问题,但是你需要一个框架,比如 casbin
leoskey
2021-09-15 10:39:11 +08:00
些简单的代码不容易,“user → user-role → role → role-permission → permission”这个还是蛮清晰的,个人建议不修改原逻辑,加缓存来提高读取性能。
LotteWong
2021-09-15 15:15:35 +08:00
@aragakiyuii #3 yes
@fgwmlhdkkkw #5 新知识😂我来研究一下
@jorneyr 确实...
@wqtacc 本来要用的...被 mentor 制止了,说不要搞得那么复杂😂
@leoskey 缓存一时半会用不上了,甚至没有部署 redis 的意思(狗头.jpg
aragakiyuii
2021-09-15 16:29:57 +08:00
@LotteWong
单机就直接读到内存里😂怎么方便怎么来
wqtacc
2021-09-15 22:36:54 +08:00
@LotteWong 实际上按照帖子的内容讲,实现了整套的权限体系,但是还是按照最直接的方法去用,虽然理解起来简单,但真正去用不比用 casbin 或者 opa 这类的访问控制引擎低多少
julyclyde
2021-09-18 12:19:07 +08:00
role 表单独存在是做什么呢?我觉得 role 的存在意义就“仅仅是 a set of permissions”啊
hsluoyz
2021-10-29 17:56:56 +08:00
@LotteWong 你这个需求就是 casbin 着力解决的痛点,没必要重新造轮子。可以跟你 mentor 说一下,我们社区可以提供免费的技术支持,加群讨论讨论方案也是好的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/801787

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX