数据范围

11/22/2022

# 一、背景与问题

1024实验室下有三个销售部,分别是销售一部、销售二部、销售三部,卓主任要求销售各部门只能看到各部门自己的订单数据,以防数据外泄恶意竞争。

# 二 、架构与思想

  1. DataScopeTypeEnum新增ORDER枚举项
  2. 对应订单查询方法(Dao接口方法)添加数据范围注解@DataScope(dataScopeType = DataScopeTypeEnum.ORDER,whereInType = DataScopeWhereInTypeEnum.DEPARTMENT,joinSql = "d.department_id in #departmentIds")
  3. 创建销售角色,给销售部的人分配此角色
  4. 设置此角色的订单业务模块的数据范围为本部门

# 三、具体使用

# 3.1、@DataScope注解

参数 类型 说明
dataScopeType DataScopeTypeEnum 定义对应数据范围的业务模块
whereInType DataScopeWhereInTypeEnum 定义数据范围Sql拼接的模式是已部门、员工还是自定义的方式判断数据范围
joinSqlImplClazz DataScopePowerStrategy 这个是扩展功能,当whereInType的值为CUSTOM_STRATEGY必填,用于固有功能无法满足需求的情况下,通过实现joinSqlImplClazz的方式来自定义数据范围
paramName String 这个同样是扩展功能,用于自定义数据范围策略的实现方法中获取接口参数的内容
whereIndex int 默认值0,定义拼接的sql从第几个Where开始
joinSql String 拼接的sql语句,非自定义策略此参数必填,目前扩展的参数变量有#departmentIds、#employeeIds

# 3.2、joinSql参数说明

参数 说明
#departmentIds whereInTypeDEPARTMENT时,此参数会自动根据对应用户在此模块的数据范围设置此变量的部门id集合,会自动拼接()
#employeeIds whereInTypeEMPLOYEE时,此参数会自动根据对应用户在此模块的数据范围设置此变量的员工id集合,会自动拼接()

# 四、实现原理

简单一句话:通过拦截sql语句,在对应的sql语句后拼接具体可见的范围条件,来控制数据范围。参考代码:MyBatisPlugin


# 联系我们

1024创新实验室-主任:卓大 (opens new window),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) (opens new window) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目。

加 主任 “卓大” 微信
拉你入群,一起学习
关注 “小镇程序员”
分享代码与生活、技术与赚钱
请 “1024创新实验室” 喝咖啡
支持我们的开源与分享

告白气球 (钢琴版)
JESSE T