This commit is contained in:
XSWL1018 2024-09-10 18:06:59 +08:00
parent d06fa02df2
commit 3279ef8ab5
29 changed files with 207 additions and 99 deletions

View File

@ -17,4 +17,8 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<plugins>
<plugin interceptor="com.ruoyi.mybatisinterceptor.interceptor.mybatis.MybatisInterceptor"></plugin>
</plugins>
</configuration>

View File

@ -1,20 +0,0 @@
package com.ruoyi.common.annotation.sql;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.DataSecurityStrategy;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSecurity {
public DataSecurityStrategy strategy() default DataSecurityStrategy.CREEATE_BY;
public String table() default "";
public String joinTableAlise() default "";
}

View File

@ -1,14 +0,0 @@
package com.ruoyi.common.annotation.sql;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MybatisHandlerOrder {
public int value() default 0;
}

View File

@ -45,11 +45,6 @@
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-midleware-mybatis-interceptor</artifactId>
<version>${ruoyi.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -58,7 +53,7 @@
<module>ruoyi-middleware-minio</module>
<module>ruoyi-middleware-redis</module>
<module>ruoyi-middleware-starter</module>
<module>ruoyi-midleware-mybatis-interceptor</module>
</modules>
<packaging>pom</packaging>
</project>

View File

@ -32,10 +32,6 @@
<artifactId>ruoyi-middleware-redis</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-midleware-mybatis-interceptor</artifactId>
</dependency>
</dependencies>

View File

@ -80,6 +80,12 @@
<artifactId>ruoyi-plugins-starter</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-mybatis-interceptor</artifactId>
<version>${ruoyi.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -90,6 +96,7 @@
<module>ruoyi-mybatis-plus</module>
<module>ruoyi-websocket</module>
<module>ruoyi-plugins-starter</module>
<module>ruoyi-mybatis-interceptor</module>
</modules>
<packaging>pom</packaging>
</project>

View File

@ -3,13 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi-middleware</artifactId>
<artifactId>ruoyi-plugins</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.8.3.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-midleware-mybatis-interceptor</artifactId>
<artifactId>ruoyi-mybatis-interceptor</artifactId>
<properties>
<maven.compiler.source>19</maven.compiler.source>
@ -19,7 +19,12 @@
<dependencies>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
<artifactId>ruoyi-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>

View File

@ -1,6 +1,6 @@
package annotation;
package com.ruoyi.mybatisinterceptor.annotation;
import com.ruoyi.common.enums.DataSecurityStrategy;
import com.ruoyi.mybatisinterceptor.enums.DataSecurityStrategy;
import java.lang.annotation.*;

View File

@ -1,19 +1,21 @@
package aspectj;
package com.ruoyi.mybatisinterceptor.aspectj;
import context.dataSecurity.SqlContextHolder;
import com.ruoyi.mybatisinterceptor.annotation.DataSecurity;
import com.ruoyi.mybatisinterceptor.model.JoinTableModel;
import com.ruoyi.mybatisinterceptor.model.WhereModel;
import com.ruoyi.mybatisinterceptor.context.dataSecurity.SqlContextHolder;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import com.ruoyi.common.annotation.sql.DataSecurity;
import com.ruoyi.common.model.JoinTableModel;
import com.ruoyi.common.model.WhereModel;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
@Aspect
@Component
public class DataSecurityAspect {

View File

@ -1,10 +1,10 @@
package context.dataSecurity;
package com.ruoyi.mybatisinterceptor.context.dataSecurity;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.enums.SqlType;
import com.ruoyi.common.model.JoinTableModel;
import com.ruoyi.common.model.WhereModel;
import com.ruoyi.mybatisinterceptor.enums.SqlType;
import com.ruoyi.mybatisinterceptor.model.JoinTableModel;
import com.ruoyi.mybatisinterceptor.model.WhereModel;
public class SqlContextHolder {
private static final ThreadLocal<JSONObject> SQL_CONTEXT_HOLDER = new ThreadLocal<>();

View File

@ -1,7 +1,7 @@
package context.page;
package com.ruoyi.mybatisinterceptor.context.page;
import com.alibaba.fastjson2.JSONObject;
import context.page.model.PageInfo;
import com.ruoyi.mybatisinterceptor.context.page.model.PageInfo;
public class PageContextHolder {
private static final ThreadLocal<JSONObject> PAGE_CONTEXT_HOLDER = new ThreadLocal<>();

View File

@ -1,4 +1,4 @@
package context.page.model;
package com.ruoyi.mybatisinterceptor.context.page.model;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.ServletUtils;

View File

@ -1,4 +1,4 @@
package context.page.model;
package com.ruoyi.mybatisinterceptor.context.page.model;
import java.util.ArrayList;
import java.util.List;

View File

@ -1,4 +1,4 @@
package com.ruoyi.common.enums;
package com.ruoyi.mybatisinterceptor.enums;
public enum DataSecurityStrategy {
JOINTABLE_CREATE_BY,

View File

@ -1,4 +1,4 @@
package com.ruoyi.common.enums;
package com.ruoyi.mybatisinterceptor.enums;
public enum SqlType {
WHERE("where"),

View File

@ -0,0 +1,129 @@
package com.ruoyi.mybatisinterceptor.interceptor.mybatis;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.ruoyi.mybatisinterceptor.annotation.MybatisHandlerOrder;
import com.ruoyi.mybatisinterceptor.sql.MybatisAfterHandler;
import com.ruoyi.mybatisinterceptor.sql.MybatisPreHandler;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import jakarta.annotation.PostConstruct;
@Component
@Intercepts({
@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class }),
@Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class, RowBounds.class,
ResultHandler.class })
})
public class MybatisInterceptor implements Interceptor {
@Autowired
private List<MybatisPreHandler> preHandlerBeans;
@Autowired
private List<MybatisAfterHandler> afterHandlerBeans;
private static List<MybatisPreHandler> preHandlersChain;
private static List<MybatisAfterHandler> afterHandlersChain;
@PostConstruct
public void init() {
List<MybatisPreHandler> sortedPreHandlers = preHandlerBeans.stream().sorted((item1, item2) -> {
int a;
int b;
MybatisHandlerOrder ann1 = item1.getClass().getAnnotation(MybatisHandlerOrder.class);
MybatisHandlerOrder ann2 = item2.getClass().getAnnotation(MybatisHandlerOrder.class);
if (ann1 == null) {
a = 0;
} else {
a = ann1.value();
}
if (ann2 == null) {
b = 0;
} else {
b = ann2.value();
}
return a - b;
}).collect(Collectors.toList());
preHandlersChain = sortedPreHandlers;
List<MybatisAfterHandler> sortedAfterHandlers = afterHandlerBeans.stream().sorted((item1, item2) -> {
int a;
int b;
MybatisHandlerOrder ann1 = item1.getClass().getAnnotation(MybatisHandlerOrder.class);
MybatisHandlerOrder ann2 = item2.getClass().getAnnotation(MybatisHandlerOrder.class);
if (ann1 == null) {
a = 0;
} else {
a = ann1.value();
}
if (ann2 == null) {
b = 0;
} else {
b = ann2.value();
}
return a - b;
}).collect(Collectors.toList());
afterHandlersChain = sortedAfterHandlers;
}
@Override
public Object intercept(Invocation invocation) throws Throwable {
Executor targetExecutor = (Executor) invocation.getTarget();
Object[] args = invocation.getArgs();
if (args.length < 6) {
if (preHandlersChain != null && preHandlersChain.size() > 0) {
MappedStatement ms = (MappedStatement) args[0];
Object parameterObject = args[1];
RowBounds rowBounds = (RowBounds) args[2];
Executor executor = (Executor) invocation.getTarget();
BoundSql boundSql = ms.getBoundSql(parameterObject);
// 可以对参数做各种处理
CacheKey cacheKey = executor.createCacheKey(ms, parameterObject, rowBounds, boundSql);
for (MybatisPreHandler item : preHandlersChain) {
item.preHandle(targetExecutor, ms, args[1], (RowBounds) args[2],
(ResultHandler) args[3], cacheKey, boundSql);
}
}
Object result = invocation.proceed();
if (afterHandlersChain != null && afterHandlersChain.size() > 0) {
for (MybatisAfterHandler item : afterHandlersChain) {
item.handleObject(result);
}
}
return result;
}
if (preHandlersChain != null && preHandlersChain.size() > 0) {
for (MybatisPreHandler item : preHandlersChain) {
item.preHandle(targetExecutor, (MappedStatement) args[0], args[1], (RowBounds) args[2],
(ResultHandler) args[3], (CacheKey) args[4], (BoundSql) args[5]);
}
}
Object result = invocation.proceed();
if (afterHandlersChain != null && afterHandlersChain.size() > 0) {
for (MybatisAfterHandler item : afterHandlersChain) {
result = item.handleObject(result);
}
}
return result;
}
}

View File

@ -1,4 +1,4 @@
package com.ruoyi.common.model;
package com.ruoyi.mybatisinterceptor.model;
import com.ruoyi.common.utils.StringUtils;

View File

@ -1,4 +1,4 @@
package com.ruoyi.common.model;
package com.ruoyi.mybatisinterceptor.model;
import com.ruoyi.common.utils.StringUtils;

View File

@ -1,8 +1,11 @@
package interceptor.mybatis;
package com.ruoyi.mybatisinterceptor.mybatis;
import java.util.List;
import java.util.stream.Collectors;
import com.ruoyi.mybatisinterceptor.annotation.MybatisHandlerOrder;
import com.ruoyi.mybatisinterceptor.sql.MybatisAfterHandler;
import com.ruoyi.mybatisinterceptor.sql.MybatisPreHandler;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
@ -16,12 +19,9 @@ import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.annotation.sql.MybatisHandlerOrder;
import jakarta.annotation.PostConstruct;
import sql.MybatisAfterHandler;
import sql.MybatisPreHandler;
@Component
@Intercepts({

View File

@ -1,4 +1,4 @@
package sql;
package com.ruoyi.mybatisinterceptor.sql;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;

View File

@ -1,8 +1,13 @@
package sql.dataSecurity;
package com.ruoyi.mybatisinterceptor.sql.dataSecurity;
import java.lang.reflect.Field;
import java.util.List;
import com.ruoyi.mybatisinterceptor.annotation.MybatisHandlerOrder;
import com.ruoyi.mybatisinterceptor.context.dataSecurity.SqlContextHolder;
import com.ruoyi.mybatisinterceptor.model.JoinTableModel;
import com.ruoyi.mybatisinterceptor.model.WhereModel;
import com.ruoyi.mybatisinterceptor.sql.MybatisPreHandler;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
@ -11,15 +16,8 @@ import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import com.ruoyi.common.annotation.sql.MybatisHandlerOrder;
import context.dataSecurity.SqlContextHolder;
import sql.MybatisPreHandler;
import com.ruoyi.common.model.JoinTableModel;
import com.ruoyi.common.model.WhereModel;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;

View File

@ -1,13 +1,14 @@
package sql.page;
package com.ruoyi.mybatisinterceptor.sql.page;
import java.util.List;
import com.ruoyi.mybatisinterceptor.annotation.MybatisHandlerOrder;
import com.ruoyi.mybatisinterceptor.context.page.PageContextHolder;
import com.ruoyi.mybatisinterceptor.context.page.model.TableInfo;
import com.ruoyi.mybatisinterceptor.sql.MybatisAfterHandler;
import org.springframework.stereotype.Component;
import com.ruoyi.common.annotation.sql.MybatisHandlerOrder;
import context.page.PageContextHolder;
import context.page.model.TableInfo;
import sql.MybatisAfterHandler;
@MybatisHandlerOrder(1)
@Component

View File

@ -1,10 +1,15 @@
package sql.page;
package com.ruoyi.mybatisinterceptor.sql.page;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.ruoyi.mybatisinterceptor.annotation.MybatisHandlerOrder;
import com.ruoyi.mybatisinterceptor.context.page.PageContextHolder;
import com.ruoyi.mybatisinterceptor.context.page.model.PageInfo;
import com.ruoyi.mybatisinterceptor.sql.MybatisPreHandler;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
@ -15,11 +20,6 @@ import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import com.ruoyi.common.annotation.sql.MybatisHandlerOrder;
import context.page.PageContextHolder;
import context.page.model.PageInfo;
import sql.MybatisPreHandler;
import com.ruoyi.common.utils.sql.SqlUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.Statement;

View File

@ -1,7 +1,7 @@
package util;
package com.ruoyi.mybatisinterceptor.util;
import context.dataSecurity.SqlContextHolder;
import com.ruoyi.mybatisinterceptor.context.dataSecurity.SqlContextHolder;
public class DataSecurityUtil {

View File

@ -1,4 +1,4 @@
package util;
package com.ruoyi.mybatisinterceptor.util;
import com.ruoyi.common.exception.UtilException;
import com.ruoyi.common.utils.StringUtils;

View File

@ -45,6 +45,11 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-mybatis-plus</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-mybatis-interceptor</artifactId>
</dependency>
</dependencies>
</project>