> 文章列表 > 5.数据权限

5.数据权限

5.数据权限

根据配置的权限字段,自动拼接sql,例如想要做部门的数据权限,每张表保存dep_id,然后查询的时候拼接 where dep_id=?,这样就实现了数据隔离。

1.示例

例如部门列表查询
角色管理授予本部门权限,然后给用户分配这个角色
5.数据权限
查询部门分页时,会进到这个拦截器,调用重写的beforeQuery方法。
5.数据权限
5.数据权限
然后调用JsqlParserSupport类的parserSingle方法
5.数据权限
然后调用processParser方法
5.数据权限
然后调用DataPermissionDatabaseInterceptor类的processSelect方法
5.数据权限
然后调用processSelectBody方法
5.数据权限
然后调用processPlainSelect方法,builderExpression会拼接权限sql,然后调用setWhere方法,设置完整的sql
5.数据权限
builderExpression方法
5.数据权限
buildDataPermissionExpression方法
5.数据权限
然后调用DeptDataPermissionRule类的getExpression方法,这个是自己写的规则类,实现DataPermissionRule接口,这个方法会获取当前用户的权限,然后进行sql生成。
5.数据权限
5.数据权限
5.数据权限
这里获取权限拿到sql之后,返回到上面的buildDataPermissionExpression方法
5.数据权限
然后继续回到builderExpression方法
5.数据权限

回到processPlainSelect方法
5.数据权限
相当于重新给where赋值
5.数据权限
5.数据权限

2.规则生效流程

1.项目启动时,先注入自己的规则类

5.数据权限

2.DataPermissionConfiguration配置类

这里是调用DeptDataPermissionRuleCustomizer接口的customize方法,传入部门规则类,用lambda表达式方式调用,传入部门规则(rule),调用部门规则类的方法。
部门权限给部门表添加的规则是 id这个字段 用户表添加的是dep_id这个字段
用户权限给用户表加的是id这个字段
5.数据权限
如果还有别的权限控制,就可以自己定义规则,然后创建xxxxDataPermissionAutoConfiguration自动配置类,注入自己的规则,创建xxxPermissionConfiguration,指定哪张表的哪个字段。
这样自己写的rule就被加载了,在YudaoDeptDataPermissionAutoConfiguration自动配置类中注入的,自定义的规则也有了,在DataPermissionConfiguration配置类中。

3.注入DataPermissionRuleFactory

在YudaoDataPermissionAutoConfiguration自动配置类中,传入所有的规则
5.数据权限
DataPermissionRuleFactory的功能就是获取所有的规则,在拦截器的拦截方法中调用
5.数据权限

4.DataPermissionDatabaseInterceptor

将DataPermissionDatabaseInterceptor加入到mybatisPlus的拦截器中,通过这个拦截器进行sql拼接。
5.数据权限

5.对请求进行拦截

6.总结

yudao-spring-boot-starter-biz-data-permission 模块
5.数据权限
yudao-module-system模块
5.数据权限

3.DataPermission注解生效流程