V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gonethen
V2EX  ›  问与答

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

  •  
  •   gonethen · Jan 27, 2021 · 3637 views
    This topic created in 1921 days ago, the information mentioned may be changed or developed.
    • 业务需求:
      • 总后台、平台、公司、员工所查询的数据各不相同,通过一种优雅的方式,一次性实现各种数据表的获取,而不是每个 sql 判断权限传递参数
      • 在业务量没有上来之前,暂时不考虑数据库分区分表之类的办法
    • 开发环境或技术框架:mysql+springcloud+mybatis(plus)
    Supplement 1  ·  Jan 27, 2021
    • 资源、菜单、角色、权限分配之类的已经实现,问题的难点在于级别之间的数据权限控制。 比如总后台能看到所有平台的订单;平台管理员只能看自己平台的订单;公司只能看自己公司的订单;员工只能看到自己发布的订单。
    15 replies    2021-01-28 12:21:37 +08:00
    imxthd
        1
    imxthd  
       Jan 27, 2021
    参考开源框架
    gonethen
        2
    gonethen  
    OP
       Jan 27, 2021
    @imxthd #1 有什么关键字吗,毫无头绪啊
    leesam1024
        3
    leesam1024  
       Jan 27, 2021
    我们是自己实现的。通过自定义注解+拦截器实现。
    权限角色分为
    基础业务角色(是否可以操作该业务功能。通过 controller 上的自定义注解+注解拦截器实现) 比如管理员、供货角色
    资源角色(定义该角色下面可以接触那些业务的更细分数据数据)

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

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

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

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

    理清楚后就可以根据不同的数据权限做功能
    如果理不清楚,理都理不清楚!怎么优雅的了!
    THESDZ
        10
    THESDZ  
       Jan 27, 2021   ❤️ 1
    我对优雅的理解:
    1.非侵入的:使用注解,配置,代理模式等
    2.无感的,即不破坏现有编程习惯
    具体的实现
    1.如果使用了通用 mapper 等,可以尝试改造通用 mapper 中代理的实现,如 select 等方法,可以增加额外的<if></if>等
    2.使用拦截器,对 sql 进行处理
    3.权限无非是参数的获取和使用,将其抽象为接口,具体的实现可以根据实际需求切换
    THESDZ
        11
    THESDZ  
       Jan 27, 2021
    @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  
       Jan 27, 2021
    添加字段 companyId 可以数据隔离
    liuzhaowei55
        13
    liuzhaowei55  
       Jan 27, 2021 via iPhone
    可以参看阿里云 dms 的审计功能,但应该做不到字段级别的审计,可以把设置字段加密
    zm8m93Q1e5otOC69
        14
    zm8m93Q1e5otOC69  
       Jan 28, 2021
    登录后把 username+部门放在 redis 中,每张表冗余 createBy,写个方法获取用户部门
    tame619
        15
    tame619  
       Jan 28, 2021 via iPhone
    部门分层次,父部门能够查看子部门的信息。角色资源管理后台接口权限。部门管理接口得到的内容。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2624 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1486ms · UTC 14:14 · PVG 22:14 · LAX 07:14 · JFK 10:14
    ♥ Do have faith in what you're doing.