# 数据权限
**Repository Path**: vip-zywork/datascope
## Basic Information
- **Project Name**: 数据权限
- **Description**: No description available
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 2
- **Created**: 2021-10-05
- **Last Updated**: 2023-05-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 数据权限插件
#### 介绍
数据权限区别于角色路由权限,是指在拥有相同路由权限的情况下,查询结果不同。
本插件封装了常用的数据权限设计模式,即用部门区分,所查询的表中必须包含部门id字段,本项目默认部门id为dept_id,可以自己修改。包含了常见的四种数据权限类型。也可以自己扩展。在需要做数据权限的地方加上一个注解,即可完成数据权限的区分,代码侵入性低,采用mybatis拦截器 + jsqlparser完成目标sql的重新拼接,跟分页插件原理大概差不多。
#### 软件架构
软件架构说明
1. mybatis 3.5.7
2. jsqlparser 4.1
3. transmittable 2.12.1
4. spring-boot 2.5.5
#### 安装教程
pom引入
```xml
* * @author ZHANG_YANG * @version 1.0 * @date 2021/9/6 10:08 * @since */ @Slf4j public class MyDataScopeHandlerImpl extends MyDataScopeHandlerSupport { public MyDataScopeHandlerImpl(MyDataScopeProperties myDataScopeProperties) { super(myDataScopeProperties); } /** * 是否 管理员,实际开发中从上下文中获取用户信息判断是否管理员, * @return */ @Override public boolean isAdmin(){ return false; } /** * 拼接权限sql的参数值,支持StringValue,跟ItemsList两种类型,在DadaScopeParameterHolder里放入上下文中,参考Controller的demo * @return MyDataScopeParameter */ @Override public MyDataScopeParameter getParameter(){ MyDataScopeType dataScopeType = DadaScopeTypeHolder.getDadaScopeType(); Object dadaScopeParameterHolder = DadaScopeParameterHolder.getDadaScopeParameterHolder(); if (Objects.isNull(dataScopeType)){ dataScopeType = MyDataScopeType.ALL; dadaScopeParameterHolder = null; } return new MyDataScopeParameter(dataScopeType,dadaScopeParameterHolder); } } ``` #### 注入spring ```java package vip.zywork.datascope.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import vip.zywork.datascope.test.CustomMyDataScopeInnerInterceptor; import vip.zywork.datasocpe.config.MyDataScopeProperties; import vip.zywork.datasocpe.interceptor.MyDataScopeInnerInterceptor; import vip.zywork.datasocpe.interceptor.MyDataScopeInterceptor; import vip.zywork.datasocpe.interceptor.MyInterceptor; import vip.zywork.datasocpe.support.MyDataScopeHandler; /** *
* * @author ZHANG_YANG * @version 1.0 * @date 2021/9/5 12:47 * @since */ @Configuration public class MybatisPlusConfig { @Bean public MyDataScopeHandler getMyDataScopeHandler(MyDataScopeProperties myDataScopeProperties){ return new MyDataScopeHandlerImpl(myDataScopeProperties); } //自定义数据权限范围 // @Bean // public CustomMyDataScopeInnerInterceptor getMyDataScopeInnerInterceptor(MyDataScopeHandler myDataScopeHandler){ // return new CustomMyDataScopeInnerInterceptor(myDataScopeHandler); // } } ``` #### Controller ```java package vip.zywork.datascope.controller; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.ItemsList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import vip.zywork.common.core.model.ResponseResult; import vip.zywork.datascope.service.ISysUserService; import vip.zywork.datasocpe.enums.MyDataScopeType; import vip.zywork.datasocpe.support.DadaScopeParameterHolder; import vip.zywork.datasocpe.support.DadaScopeTypeHolder; import java.util.Arrays; /** *
* 前端控制器 *
* * @author Zy * @since 2021-09-05 */ @RestController @RequestMapping("/user/sys-user") public class SysUserController { @Autowired private ISysUserService userService; @GetMapping("test") public ResponseResult test(String type){ DadaScopeTypeHolder.setDadaScopeType(MyDataScopeType.typeOf(type)); if (MyDataScopeType.ALL.getType().equals(type)){ DadaScopeParameterHolder.setDadaScopeParameterHolder(null); } if (MyDataScopeType.THIS_DEPARTMENT.getType().equals(type)){ DadaScopeParameterHolder.setDadaScopeParameterHolder(new StringValue("1")); } if (MyDataScopeType.CUSTOM.getType().equals(type) || MyDataScopeType.DEPARTMENT_FOLLOWING.getType().equals(type)){ ItemsList itemsList = new ExpressionList(Arrays.asList( new StringValue("1"), new StringValue("2"), new StringValue("3"), new StringValue("5") )); DadaScopeParameterHolder.setDadaScopeParameterHolder(itemsList); } return ResponseResult.success(userService.selectList()); } } ``` #### mapper上添加`@MyDataScope`,目前只支持在mapper方法上使用 ```java package vip.zywork.datascope.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import vip.zywork.datascope.entity.SysUser; import vip.zywork.datasocpe.annotation.MyDataScope; import vip.zywork.datasocpe.enums.MyDataScopeType; import vip.zywork.datasocpe.support.DadaScopeTypeHolder; import java.util.List; /** ** Mapper 接口 *
* * @author Zy * @since 2021-09-05 */ public interface SysUserDao extends BaseMapper