采用常见的五表法实现 RBAC 模块( user 、role 、permission 、user-role 、role-permission ),leader 表示每次鉴权都要:user → user-role → role → role-permission → permission,这样做的复杂度略高。现在想了两种方案优化:
请问 uu 们有没有其它更好的优化方法呀?
1
JaguarJack 2021-09-14 16:12:13 +08:00
对于后台而言,一般都是查多写少。一般都是缓存
|
2
LotteWong OP @JaguarJack 现在因为业务限制估计用不了 Redis 之类的,第二种方法有点类似缓存的意思。
|
3
aragakiyuii 2021-09-14 16:26:39 +08:00
单机的?
|
4
fgwmlhdkkkw 2021-09-14 16:26:39 +08:00
1,role,permission,role-permission 这三个表的信息与用户无关,可以全加载到内存中,最终生成 {role=>permissions}。
2,通过 user-role 读取每个用户的角色列表,然后做{roles => permissions}的 cache 。 |
5
fgwmlhdkkkw 2021-09-14 16:27:09 +08:00
@fgwmlhdkkkw #4 permissions 可以用 bitmap
|
6
afirefish 2021-09-14 16:50:58 +08:00
4 楼正解,如果采用的 jwt 认证的话,省至可以省去查询 user 表。弊端就是无法做到用户禁用后马上不能登录。
|
7
learningman 2021-09-14 17:29:18 +08:00
全读内存里呗。。。
|
8
jorneyr 2021-09-14 18:31:55 +08:00
加新的表 user-permission 。存在的问题:当用户绑定角色 or 角色绑定权限时,每次都要更新 user-permission 表,写的消耗很大,而且有很多的冗余数据。
这个就很好,写能有多大消耗? 权限更新是一个低频操作,难不成你们的系统没事就高并发改权限吗? |
9
wqtacc 2021-09-14 22:57:43 +08:00
鉴权的话,这套模型没问题,但是你需要一个框架,比如 casbin
|
10
leoskey 2021-09-15 10:39:11 +08:00
些简单的代码不容易,“user → user-role → role → role-permission → permission”这个还是蛮清晰的,个人建议不修改原逻辑,加缓存来提高读取性能。
|
11
LotteWong OP @aragakiyuii #3 yes
@fgwmlhdkkkw #5 新知识😂我来研究一下 @jorneyr 确实... @wqtacc 本来要用的...被 mentor 制止了,说不要搞得那么复杂😂 @leoskey 缓存一时半会用不上了,甚至没有部署 redis 的意思(狗头.jpg |
12
aragakiyuii 2021-09-15 16:29:57 +08:00 via iPhone
@LotteWong
单机就直接读到内存里😂怎么方便怎么来 |
13
wqtacc 2021-09-15 22:36:54 +08:00
@LotteWong 实际上按照帖子的内容讲,实现了整套的权限体系,但是还是按照最直接的方法去用,虽然理解起来简单,但真正去用不比用 casbin 或者 opa 这类的访问控制引擎低多少
|
14
julyclyde 2021-09-18 12:19:07 +08:00
role 表单独存在是做什么呢?我觉得 role 的存在意义就“仅仅是 a set of permissions”啊
|