有没有关于数据查询权限控制的优雅实现方式 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gonethen
V2EX    问与答

有没有关于数据查询权限控制的优雅实现方式

  •  
  •   gonethen 2021-01-27 09:22:00 +08:00 3237 次点击
    这是一个创建于 1719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 业务需求:
      • 总后台、平台、公司、员工所查询的数据各不相同,通过一种优雅的方式,一次性实现各种数据表的获取,而不是每个 sql 判断权限传递参数
      • 在业务量没有上来之前,暂时不考虑数据库分区分表之类的办法
    • 开发环境或技术框架:mysql+springcloud+mybatis(plus)
    第 1 条附言    2021-01-27 12:01:02 +08:00
    • 资源、菜单、角色、权限分配之类的已经实现,问题的难点在于级别之间的数据权限控制。 比如总后台能看到所有平台的订单;平台管理员只能看自己平台的订单;公司只能看自己公司的订单;员工只能看到自己发布的订单。
    15 条回复    2021-01-28 12:21:37 +08:00
    imxthd
        1
    imxthd  
       2021-01-27 09:26:58 +08:00
    参考开源框架
    gonethen
        2
    gonethen  
    OP
       2021-01-27 10:26:07 +08:00
    @imxthd #1 有什么关键字吗,毫无头绪啊
    leesam1024
        3
    leesam1024  
       2021-01-27 11:48:37 +08:00
    我们是自己实现的。通过自定义注解+拦截器实现。
    权限角色分为
    基础业务角色(是否可以操作该业务功能。通过 controller 上的自定义注解+注解拦截器实现) 比如管理员、供货角色
    资源角色(定义该角色下面可以接触那些业务的更细分数据数据)

    用户必须先有基础业务角色后,才能操作该业务角色下面的资源

    基础业务角色是程序开发时就定义好,写死的。
    资源角色,可以通过管理员动态添加。

    1 个用户可以对应多个基础业务角色和资源角色
    hxyCoding
        4
    hxyCoding  
       2021-01-27 11:53:59 +08:00
    如果只是可视化查询,可以考虑后置屏蔽
    gonethen
        5
    gonethen  
    OP
       2021-01-27 11:59:28 +08:00
    @leesam1024 #3 我想我的问题表述的还是不够具体。其实我想问的重点在于上下级之间的数据权限控制。

    比如总后台能看到所有平台的订单;平台管理员只能看自己平台的订单;公司只能看自己公司的订单;员工只能看到自己发布的订单。
    hsluoyz
        6
    hsluoyz  
    PRO
       2021-01-27 12:02:54 +08:00
    Casbin 支持多级 RBAC 模型和多租户模型,可以表达你所说的“比如总后台能看到所有平台的订单;平台管理员只能看自己平台的订单;公司只能看自己公司的订单;员工只能看到自己发布的订单。”
    sakasaka
        7
    sakasaka  
       2021-01-27 13:40:45 +08:00
    尝试在业务表加入有关权限的标识
    imxthd
        8
    imxthd  
       2021-01-27 14:03:38 +08:00
    @gonethen bladex
    liuxey
        9
    liuxey  
       2021-01-27 14:05:40 +08:00
    即使“数据各不相同”,也要进行梳理分类,比如:全数据权限、总公司权限、分公司权限、部门权限、个人权限

    理清楚后就可以根据不同的数据权限做功能
    如果理不清楚,理都理不清楚!怎么优雅的了!
    THESDZ
        10
    THESDZ  
       2021-01-27 16:15:34 +08:00   1
    我对优雅的理解:
    1.非侵入的:使用注解,配置,代理模式等
    2.无感的,即不破坏现有编程习惯
    具体的实现
    1.如果使用了通用 mapper 等,可以尝试改造通用 mapper 中代理的实现,如 select 等方法,可以增加额外的<if></if>等
    2.使用拦截器,对 sql 进行处理
    3.权限无非是参数的获取和使用,将其抽象为接口,具体的实现可以根据实际需求切换
    THESDZ
        11
    THESDZ  
       2021-01-27 16:25:04 +08:00
    @gonethen 数据权限使用的数据中不包含逻辑
    1
    1.1
    1.1.1
    1.2
    如果是 1.1,则传入 1.1,1.1.1
    如果是 1,则传入 1,1.1,1.1.1,1.2

    全部的情况建议传入所有的,但是也可以特殊判断

    目的是,如果有权限应该是显示分配了权限才有
    pigcandance
        12
    pigcandance  
       2021-01-27 16:56:58 +08:00
    添加字段 companyId 可以数据隔离
    liuzhaowei55
        13
    liuzhaowei55  
       2021-01-27 18:31:40 +08:00 via iPhone
    可以参看阿里云 dms 的审计功能,但应该做不到字段级别的审计,可以把设置字段加密
    zm8m93Q1e5otOC69
        14
    zm8m93Q1e5otOC69  
       2021-01-28 08:25:55 +08:00
    登录后把 username+部门放在 redis 中,每张表冗余 createBy,写个方法获取用户部门
    tame619
        15
    tame619  
       2021-01-28 12:21:37 +08:00 via iPhone
    部门分层次,父部门能够查看子部门的信息。角色资源管理后台接口权限。部门管理接口得到的内容。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1050 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:12 PVG 07:12 LAX 16:12 JFK 19:12
    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