背景
最近在公司做项目的时候,需要实现数据权限最终方案就是根据借助mybatis–plus的插件,拦截sql并解析规则拼接实现数据权限拦截,记录一下。
1.使用
1.1 配置插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加数据权限插件
DataPermissionInterceptor dataPermissionInterceptor = new DataPermissionInterceptor();
// 添加自定义的数据权限处理器
dataPermissionInterceptor.setDataPermissionHandler(dataScopePermissionHandler);
interceptor.addInnerInterceptor(dataPermissionInterceptor);
//分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
1.2 使用
权限插件使用
public class DataScopePermissionHandler implements DataPermissionHandler {
@Override
public Expression getSqlSegment(Expression where, String mappedStatementId) {
// 根据自己的业务拦截数据权限
return where ;
}
1.3分页使用
Page<DTO> page = xxxapper.selectPage(new Page(query.getPageNo(), query.getPageSize()), queryWrapper);
1.4 java拦截原理类图
2.mybatis-plus 插件原理分析
2.1 mapper信息注册
org.mybatis.spring.annotation.MapperScannerRegistrar
2.1.2 MapperScannerRegistrar注册信息
注册基本的属性到MapperScannerConfigurer里面
2.1.3 MapperScannerConfigurer后置处理器PostProcessor
org.mybatis.spring.mapper.MapperScannerConfigure
2.1.4 ClassPathMapperScanner根据mapper路径注册bean定义信息
org.mybatis.spring.mapper.MapperScannerConfigure
2.1.5 MapperFactoryBean创建代理对象mapper
org.mybatis.spring.mapper.MapperFactoryBean#getObject
org.mybatis.spring.SqlSessionTemplate#getMapper
com.baomidou.mybatisplus.core.MybatisMapperRegistry#getMapper
com.baomidou.mybatisplus.core.override.MybatisMapperProxyFactory#newInstance()
2.2 拦截器插件初始化
2.2.1 MybatisPlusAutoConfiguration实例化
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
org.apache.ibatis.session.SqlSessionFactory
SqlSessionFactory把plugs设置到MybatisSqlSessionFactoryBean里面
com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean#setPlugins
MybatisSqlSessionFactoryBean初始化后置处理器
MybatisSqlSessionFactoryBean#afterPropertiesSet
com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean#buildSqlSessionFactory
org.apache.ibatis.session.Configuration#addInterceptor
org.apache.ibatis.plugin.InterceptorChain#addInterceptor
2.3 查询请求拦截
Page<DTO> page = xxxMapper.selectPage(new Page(query.getPageNo(), query.getPageSize()), queryWrapper);
com.baomidou.mybatisplus.core.override.MybatisMapperProxy
com.baomidou.mybatisplus.core.override.MybatisMapperProxy#invoke
com.baomidou.mybatisplus.core.override.MybatisMapperMethod#execute
org.apache.ibatis.session.defaults.DefaultSqlSession#selectList()
org.mybatis.spring.SqlSessionUtils#getSqlSession()
org.mybatis.spring.SqlSessionTemplate.SqlSessionInterceptor#invoke
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession()
org.apache.ibatis.session.Configuration#newExecutor()
org.apache.ibatis.session.Configuration#newExecutor()
com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor#plugin
org.apache.ibatis.plugin.Plugin#wrap
2.4 数据权限拦截器
2.4.1 MybatisPlusInterceptor拦截查询
com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept
2.4.2 DataPermissionInterceptor拦截查询
com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor
com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor#beforeQuery
com.baomidou.mybatisplus.extension.parser.JsqlParserSupport#parserSingle
com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor#processSelect
com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor#setWhere
2.4.3 DataPermissionHandler自定义执行器前置过滤
原文地址:https://blog.csdn.net/qq_35270227/article/details/130950624
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_27592.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!