采用常见的五表法实现 RBAC 模块( user 、role 、permission 、user-role 、role-permission ),leader 表示每次鉴权都要:user → user-role → role → role-permission → permission,这样做的复杂度略高。现在想了两种方案优化:
请问 uu 们有没有其它更好的优化方法呀?
![]() | 1 akagishigeru 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”啊 |