关于 RBAC 设计优化的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LotteWong
V2EX    数据库

关于 RBAC 设计优化的问题

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

    采用常见的五表法实现 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
    akagishigeru
        1
    akagishigeru  
       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  
    PRO
       2021-10-29 17:56:56 +08:00
    @LotteWong 你这个需求就是 casbin 着力解决的痛点,没必要重新造轮子。可以跟你 mentor 说一下,我们社区可以提供免费的技术支持,加群讨论讨论方案也是好的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     864 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:13 PVG 05:13 LAX 14:13 JFK 17:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86