V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LotteWong
V2EX  ›  数据库

关于 RBAC 设计优化的问题

  •  
  •   LotteWong · 2021-09-14 16:09:45 +08:00 · 1725 次点击
    这是一个创建于 1200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    采用常见的五表法实现 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 们有没有其它更好的优化方法呀?

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

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