Skip to content

一、背景与问题

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

二 、架构与思想

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

三、具体使用

3.1、@DataScope注解

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

3.2、joinSql参数说明

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

四、实现原理

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


outline: 'deep'

联系我们

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

加微信: 卓大
拉你入群,一起学习
公众号 :六边形工程师
分享:赚钱、代码、生活
请 “1024创新实验室”
“烩面里加肉”
“ 咖啡配胡辣汤,提神又饱腹”
抖音 : 六边形工程师
直播:赚钱、代码、中医