/**
|
* Copyright (c) 2018 人人开源 All rights reserved.
|
*
|
* https://www.renren.io
|
*
|
* 版权所有,侵权必究!
|
*/
|
|
package com.iailab.framework.mybatis.interceptor;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
|
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
|
import net.sf.jsqlparser.JSQLParserException;
|
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.StringValue;
|
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
|
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
import net.sf.jsqlparser.statement.select.PlainSelect;
|
import net.sf.jsqlparser.statement.select.Select;
|
import org.apache.ibatis.executor.Executor;
|
import org.apache.ibatis.mapping.BoundSql;
|
import org.apache.ibatis.mapping.MappedStatement;
|
import org.apache.ibatis.session.ResultHandler;
|
import org.apache.ibatis.session.RowBounds;
|
|
import java.util.Map;
|
|
/**
|
* 数据过滤
|
*
|
* @author Mark sunlightcs@gmail.com
|
*/
|
public class DataFilterInterceptor implements InnerInterceptor {
|
|
@Override
|
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
|
DataScope scope = getDataScope(parameter);
|
// 不进行数据过滤
|
if(scope == null || StrUtil.isBlank(scope.getSqlFilter())){
|
return;
|
}
|
|
// 拼接新SQL
|
String buildSql = getSelect(boundSql.getSql(), scope);
|
|
// 重写SQL
|
PluginUtils.mpBoundSql(boundSql).sql(buildSql);
|
}
|
|
private DataScope getDataScope(Object parameter){
|
if (parameter == null){
|
return null;
|
}
|
|
// 判断参数里是否有DataScope对象
|
if (parameter instanceof Map) {
|
Map<?, ?> parameterMap = (Map<?, ?>) parameter;
|
for (Map.Entry entry : parameterMap.entrySet()) {
|
if (entry.getValue() != null && entry.getValue() instanceof DataScope) {
|
return (DataScope) entry.getValue();
|
}
|
}
|
} else if (parameter instanceof DataScope) {
|
return (DataScope) parameter;
|
}
|
|
return null;
|
}
|
|
private String getSelect(String buildSql, DataScope scope){
|
try {
|
Select select = (Select) CCJSqlParserUtil.parse(buildSql);
|
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
|
|
Expression expression = plainSelect.getWhere();
|
if(expression == null){
|
plainSelect.setWhere(new StringValue(scope.getSqlFilter()));
|
}else{
|
AndExpression andExpression = new AndExpression(expression, new StringValue(scope.getSqlFilter()));
|
plainSelect.setWhere(andExpression);
|
}
|
|
return select.toString().replaceAll("'", "");
|
}catch (JSQLParserException e){
|
return buildSql;
|
}
|
}
|
}
|