服务端 rbac 权限验证,是否有必要进行增加性能优化? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tctc4869
V2EX    Java

服务端 rbac 权限验证,是否有必要进行增加性能优化?

  •  1
     
  •   tctc4869 2020 年 5 月 26 日 3474 次点击
    这是一个创建于 2061 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我不想用服务端里基于注解的权限验证框架,比如 Shiro 。所有的服务端 action 接口的权限配置都在后台管理界面进行配置

    最简单的 rbac 权限验证,放在 sql 数据库就是 5 个表,用户表,用户角色关联表,角色表,角色菜单关联表,菜单表。而验证就是凭借用户 id 从用户角色表查到关联的 role,在从 role,查到关联的 menu 。一个 sql 语句经过 4 个表。

    那么,服务端 rbac 权验证,是否有必要进行增加性能优化?比如减少权限验证的时间。

    我目前就想到一个方式,利用面向对象语言的引用特性,当项目启动时,载入角色与权限的关联数据永驻到服务端内存中,用户登录之后,创建一个集合,然后往集合内添加永驻在内存里的用户所含的角色权限关联引用,并且集合与用户绑定在 session 里。每次权限验证,都将请求 path 和用户的权限引用集合与服务端永驻内存的权限缓存进行对比。不在查询数据库。唯一看得出的缺陷是实时更新角色与 role 对应的维护有点麻烦。除了这个还有其他的方式么?

    现在增加了 app 端,app 端用认证的不是 session,还是 token 。这个情况下,app 端的权限验证如果要进行性能优化,那是用什么方式呢,把角色关联数据加密,并到 token 令牌里安全么?还是性能优化没有必要的,直接根据 userid 去调 jdbc,用各 sql 语句一梭子查到菜单表进行对比就行了?

    各位搭建编写 web 服务端的时候,权限验证有没有想过性能优化?有的话,一般都是怎样的?

    7 条回复    2020-06-04 15:21:22 +08:00
    cruii
        1
    cruii  
       2020 年 5 月 26 日
    把用户菜单存到 redis 不行么
    rockyou12
        2
    rockyou12  
       2020 年 5 月 26 日
    首先权限设计不要针对菜单,而要针对资源。不然你多个端(web 、app 等)无法用一套统一的接口与统一的权限框架。

    你要是用 jpa,直接都是对象关联,就相当于缓存一个大对象(用户->角色->权限)。我给公司写的框架其实就是这样缓存的。如果要进行更新,不是只更新权限或者角色这层,而是整个大对象全部删掉后重新整个更新。

    不过说实话,用户量不大这个缓存作用也不是很大。

    而且 app 端哪用优化什么,你登陆了就该拿用户所有权限,然后前端自己比对校验。要是访问到无权限的接口你后端就该直接报错。
    hsluoyz
        3
    hsluoyz  
    PRO
       2020 年 5 月 26 日
    不要自己搞五张表了,Casbin 直接帮你 handle 三张表:用户角色关联表,角色表,角色菜单关联表,并且性能都是优化好的,支持各种语言、数据库。用户表、菜单表如果字段多,可以自己维护下。你不是专业做权限的,没必要入这个坑,直接用 Casbin 即可: https://casbin.org/
    tctc4869
        4
    tctc4869  
    OP
       2020 年 5 月 26 日
    @rockyou12 前端自己对比校验?什么意思?校验权限,一般不都是在后端么
    rockyou12
        5
    rockyou12  
       2020 年 5 月 26 日
    @tctc4869 前端的菜单、按钮显不显示还是只能前端自己做啊
    wshcdr
        6
    wshcdr  
       2020 年 5 月 27 日
    权限一般都结合缓存的
    esolve
        7
    esolve  
       2020 年 6 月 4 日
    @hsluoyz

    有缓存支持吗?
    感觉缓存和数据库一致性很难设计啊
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2669 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 12:21 PVG 20:21 LAX 04:21 JFK 07:21
    Do have faith in what you're doing.
    ubao msn 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