数据权限,一般就是作用于查询,规定用户能看到哪些数据。本次案例以通用的 本人,本部门,本公司,全部 来做,具体可以根据自己业务来灵活处理。
一.数据权限要设置到角色上(但要注意,一个用户可能是有多个角色的,对于某个模块的数据权限,要去角色中最高等级的权限)
1.定义数据权限类型,即哪些模块需要加数据权限。比如:员工模块
权限范围:
2.在后台管理操作上,对应数据权限的设置,模块信息就是从这里取的,然后进行设置保存到数据库。当然,此模块也可以做成数据保存到数据库。
3.后台保存后,会将角色的数据权限信息,存入到数据库,如下
二.定义数据范围注解
使用方法:在mapper查询上注解,如下
@DataScope(dataScopeType = DataScopeTypeEnum.EMPLOYEE,dataScopeWhereInType = DataScopeWhereInTypeEnum.EMPLOYEE, whereIndex = 0, joinSql = "e.id in (#employeeIds)")
List<EmployeeDTO> selectEmployeeList(Page page, @Param("queryDTO") EmployeeQueryDTO queryDTO);
三.定义一个业务处理类,来处理这些注解,并且,根据注解,来获取查询的数据权限,并拼接sql
1.使用 @PostConstruct来获取项目所有 使用了注解 @DataScope的方法,并存入缓存
2.编写拼接sql的方法
四. 拦截mybatis sql语句,然后根据 方法名,从业务处理类获取到使用的 @DataScope信息,调用业务处理类 getJoinSql 来根据权限拼接sql
以上则数据权限完成,之后哪里需要用到数据权限,就@DataScope即可。
方法思路就是这样,具体都可以根据自己的业务实现,无论是微服务系统还是单系统,都可以。当然,特别注意,对于权限的查询、角色、员工等信息的查询,最好提前缓存,直接从缓存获取,提高查询效率。