u
This commit is contained in:
parent
d06fa02df2
commit
3279ef8ab5
@ -16,5 +16,9 @@ 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>
|
||||
|
@ -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 "";
|
||||
}
|
@ -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;
|
||||
}
|
@ -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>
|
||||
|
@ -32,10 +32,6 @@
|
||||
<artifactId>ruoyi-middleware-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-midleware-mybatis-interceptor</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
@ -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>
|
||||
</project>
|
||||
|
@ -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>
|
||||
|
@ -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.*;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package annotation;
|
||||
package com.ruoyi.mybatisinterceptor.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
@ -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 {
|
@ -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<>();
|
@ -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<>();
|
@ -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;
|
@ -1,4 +1,4 @@
|
||||
package context.page.model;
|
||||
package com.ruoyi.mybatisinterceptor.context.page.model;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package context.page.model;
|
||||
package com.ruoyi.mybatisinterceptor.context.page.model;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
@ -1,4 +1,4 @@
|
||||
package com.ruoyi.common.enums;
|
||||
package com.ruoyi.mybatisinterceptor.enums;
|
||||
|
||||
public enum DataSecurityStrategy {
|
||||
JOINTABLE_CREATE_BY,
|
@ -1,4 +1,4 @@
|
||||
package com.ruoyi.common.enums;
|
||||
package com.ruoyi.mybatisinterceptor.enums;
|
||||
|
||||
public enum SqlType {
|
||||
WHERE("where"),
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.ruoyi.common.model;
|
||||
package com.ruoyi.mybatisinterceptor.model;
|
||||
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.ruoyi.common.model;
|
||||
package com.ruoyi.mybatisinterceptor.model;
|
||||
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
|
||||
@ -64,4 +64,4 @@ public class WhereModel {
|
||||
public String getSqlString() {
|
||||
return String.format(" %s %s %s %s ", this.getConnectType(), this.getFullTableColumn(), this.method, this.value);
|
||||
}
|
||||
}
|
||||
}
|
@ -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({
|
@ -1,4 +1,4 @@
|
||||
package sql;
|
||||
package com.ruoyi.mybatisinterceptor.sql;
|
||||
|
||||
public interface MybatisAfterHandler {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package sql;
|
||||
package com.ruoyi.mybatisinterceptor.sql;
|
||||
|
||||
import org.apache.ibatis.cache.CacheKey;
|
||||
import org.apache.ibatis.executor.Executor;
|
@ -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;
|
@ -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
|
@ -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;
|
@ -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 {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package util;
|
||||
package com.ruoyi.mybatisinterceptor.util;
|
||||
|
||||
import com.ruoyi.common.exception.UtilException;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user