mybatis sql拦截 方法做java 数据权限(应公司要求,写个方案,记录在这里)

原创
07/29 10:22
阅读数 172

数据权限,一般就是作用于查询,规定用户能看到哪些数据。本次案例以通用的   本人,本部门,本公司,全部  来做,具体可以根据自己业务来灵活处理。

一.数据权限要设置到角色上(但要注意,一个用户可能是有多个角色的,对于某个模块的数据权限,要去角色中最高等级的权限)

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即可。

方法思路就是这样,具体都可以根据自己的业务实现,无论是微服务系统还是单系统,都可以。当然,特别注意,对于权限的查询、角色、员工等信息的查询,最好提前缓存,直接从缓存获取,提高查询效率。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部