V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gonethen
V2EX  ›  问与答

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

  •  
  •   gonethen · 2021-01-27 09:22:00 +08:00 · 2718 次点击
    这是一个创建于 1425 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 业务需求:
      • 总后台、平台、公司、员工所查询的数据各不相同,通过一种优雅的方式,一次性实现各种数据表的获取,而不是每个 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  
       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 的审计功能,但应该做不到字段级别的审计,可以把设置字段加密
    uselessVisitor
        14
    uselessVisitor  
       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   ·   实用小工具   ·   1397 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.