一、背景与问题
1024实验室下有三个销售部,分别是销售一部、销售二部、销售三部,卓主任要求销售各部门只能看到各部门自己的订单数据,以防数据外泄恶意竞争。
二 、架构与思想
DataScopeTypeEnum
新增ORDER
枚举项- 对应订单查询方法(Dao接口方法)添加数据范围注解
@DataScope(dataScopeType = DataScopeTypeEnum.ORDER,whereInType = DataScopeWhereInTypeEnum.DEPARTMENT,joinSql = "d.department_id in #departmentIds")
- 创建销售角色,给销售部的人分配此角色
- 设置此角色的订单业务模块的数据范围为本部门
三、具体使用
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 | 当whereInType 为DEPARTMENT 时,此参数会自动根据对应用户在此模块的数据范围设置此变量的部门id集合,会自动拼接() |
#employeeIds | 当whereInType 为EMPLOYEE 时,此参数会自动根据对应用户在此模块的数据范围设置此变量的员工id集合,会自动拼接() |
四、实现原理
简单一句话:通过拦截sql语句,在对应的sql语句后拼接具体可见的范围条件,来控制数据范围。参考代码:MyBatisPlugin
outline: 'deep'
联系我们
1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。
加微信: 卓大 拉你入群,一起学习 | 公众号 :六边形工程师 分享:赚钱、代码、生活 | 请 “1024创新实验室” “烩面里加肉” “ 咖啡配胡辣汤,提神又饱腹” | 抖音 : 六边形工程师 直播:赚钱、代码、中医 |