houzhongjian
2024-10-30 a28ca3f36d0ace05966a8c0fac1e4b5fe921f882
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/interceptor/DataFilterInterceptor.java
@@ -1,89 +1,81 @@
///**
// * Copyright (c) 2018 人人开源 All rights reserved.
// *
// * https://www.renren.io
// *
// * 版权所有,侵权必究!
// */
//
//package com.iailab.module.common.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;
//        }
//    }
//}
package com.iailab.module.data.common.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;
        }
    }
}