根据配置的权限字段,自动拼接sql,例如想要做部门的数据权限,每张表保存dep_id,然后查询的时候拼接 where dep_id=?,这样就实现了数据隔离。
1.示例
例如部门列表查询
角色管理授予本部门权限,然后给用户分配这个角色
查询部门分页时,会进到这个拦截器,调用重写的beforeQuery方法。
然后调用JsqlParserSupport类的parserSingle方法
然后调用processParser方法
然后调用DataPermissionDatabaseInterceptor类的processSelect方法
然后调用processSelectBody方法
然后调用processPlainSelect方法,builderExpression会拼接权限sql,然后调用setWhere方法,设置完整的sql
builderExpression方法
buildDataPermissionExpression方法
然后调用DeptDataPermissionRule类的getExpression方法,这个是自己写的规则类,实现DataPermissionRule接口,这个方法会获取当前用户的权限,然后进行sql生成。
这里获取权限拿到sql之后,返回到上面的buildDataPermissionExpression方法
然后继续回到builderExpression方法
回到processPlainSelect方法
相当于重新给where赋值
2.规则生效流程
1.项目启动时,先注入自己的规则类
2.DataPermissionConfiguration配置类
这里是调用DeptDataPermissionRuleCustomizer接口的customize方法,传入部门规则类,用lambda表达式方式调用,传入部门规则(rule),调用部门规则类的方法。
部门权限给部门表添加的规则是 id这个字段 用户表添加的是dep_id这个字段
用户权限给用户表加的是id这个字段
如果还有别的权限控制,就可以自己定义规则,然后创建xxxxDataPermissionAutoConfiguration自动配置类,注入自己的规则,创建xxxPermissionConfiguration,指定哪张表的哪个字段。
这样自己写的rule就被加载了,在YudaoDeptDataPermissionAutoConfiguration自动配置类中注入的,自定义的规则也有了,在DataPermissionConfiguration配置类中。
3.注入DataPermissionRuleFactory
在YudaoDataPermissionAutoConfiguration自动配置类中,传入所有的规则
DataPermissionRuleFactory的功能就是获取所有的规则,在拦截器的拦截方法中调用
4.DataPermissionDatabaseInterceptor
将DataPermissionDatabaseInterceptor加入到mybatisPlus的拦截器中,通过这个拦截器进行sql拼接。
5.对请求进行拦截
6.总结
yudao-spring-boot-starter-biz-data-permission 模块
yudao-module-system模块