From dd2abd95c951f8e037e78c421a37ffb5aa999e57 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期五, 22 十一月 2024 10:43:44 +0800
Subject: [PATCH] fix 修复 aop 无法拦截mapper接口上的注解导致的问题 类上依旧使用扫描处理
---
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java | 2
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java | 10 +++--
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java | 87 ++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 91 insertions(+), 8 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
index f7d14ee..1e8d619 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/config/MybatisPlusConfig.java
@@ -52,7 +52,7 @@
* 鏁版嵁鏉冮檺鎷︽埅鍣�
*/
public PlusDataPermissionInterceptor dataPermissionInterceptor() {
- return new PlusDataPermissionInterceptor();
+ return new PlusDataPermissionInterceptor(SpringUtils.getProperty("mybatis-plus.mapperPackage"));
}
/**
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
index 236538a..4ae6742 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java
@@ -1,5 +1,6 @@
package org.dromara.common.mybatis.handler;
+import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
@@ -8,6 +9,7 @@
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import org.apache.ibatis.io.Resources;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
@@ -19,17 +21,26 @@
import org.dromara.common.mybatis.enums.DataScopeType;
import org.dromara.common.mybatis.helper.DataPermissionHelper;
import org.dromara.common.satoken.utils.LoginHelper;
+import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.expression.BeanFactoryResolver;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.type.ClassMetadata;
+import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.expression.BeanResolver;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.util.ClassUtils;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
/**
@@ -42,6 +53,11 @@
public class PlusDataPermissionHandler {
/**
+ * 绫诲悕绉颁笌娉ㄨВ鐨勬槧灏勫叧绯荤紦瀛�(鐢变簬aop鏃犳硶鎷︽埅mybatis鎺ュ彛绫讳笂鐨勬敞瑙� 鍙兘閫氳繃鍚姩棰勬壂鎻忕殑鏂瑰紡杩涜)
+ */
+ private final Map<String, DataPermission> dataPermissionCacheMap = new ConcurrentHashMap<>();
+
+ /**
* spel 瑙f瀽鍣�
*/
private final ExpressionParser parser = new SpelExpressionParser();
@@ -50,6 +66,15 @@
* bean瑙f瀽鍣� 鐢ㄤ簬澶勭悊 spel 琛ㄨ揪寮忎腑瀵� bean 鐨勮皟鐢�
*/
private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory());
+
+ /**
+ * 鏋勯�犳柟娉曪紝鎵弿鎸囧畾鍖呬笅鐨� Mapper 绫诲苟鍒濆鍖栫紦瀛�
+ *
+ * @param mapperPackage Mapper 绫绘墍鍦ㄧ殑鍖呰矾寰�
+ */
+ public PlusDataPermissionHandler(String mapperPackage) {
+ scanMapperClasses(mapperPackage);
+ }
/**
* 鑾峰彇鏁版嵁杩囨护鏉′欢鐨� SQL 鐗囨
@@ -62,7 +87,7 @@
public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) {
try {
// 鑾峰彇鏁版嵁鏉冮檺閰嶇疆
- DataPermission dataPermission = DataPermissionHelper.getPermission();
+ DataPermission dataPermission = getDataPermission(mappedStatementId);
// 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
LoginUser currentUser = DataPermissionHelper.getVariable("user");
if (ObjectUtil.isNull(currentUser)) {
@@ -170,11 +195,67 @@
}
/**
+ * 鎵弿鎸囧畾鍖呬笅鐨� Mapper 绫伙紝骞舵煡鎵惧叾涓甫鏈夌壒瀹氭敞瑙g殑鏂规硶鎴栫被
+ *
+ * @param mapperPackage Mapper 绫绘墍鍦ㄧ殑鍖呰矾寰�
+ */
+ private void scanMapperClasses(String mapperPackage) {
+ // 鍒涘缓璧勬簮瑙f瀽鍣ㄥ拰鍏冩暟鎹鍙栧伐鍘�
+ PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+ CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory();
+ // 灏� Mapper 鍖呰矾寰勬寜鍒嗛殧绗︽媶鍒嗕负鏁扮粍
+ String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
+ String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX;
+ try {
+ for (String packagePattern : packagePatternArray) {
+ // 灏嗗寘璺緞杞崲涓鸿祫婧愯矾寰�
+ String path = ClassUtils.convertClassNameToResourcePath(packagePattern);
+ // 鑾峰彇鎸囧畾璺緞涓嬬殑鎵�鏈� .class 鏂囦欢璧勬簮
+ Resource[] resources = resolver.getResources(classpath + path + "/*.class");
+ for (Resource resource : resources) {
+ // 鑾峰彇璧勬簮鐨勭被鍏冩暟鎹�
+ ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata();
+ // 鑾峰彇璧勬簮瀵瑰簲鐨勭被瀵硅薄
+ Class<?> clazz = Resources.classForName(classMetadata.getClassName());
+ // 鏌ユ壘绫讳腑鐨勭壒瀹氭敞瑙�
+ if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) {
+ DataPermission dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class);
+ dataPermissionCacheMap.put(clazz.getName(), dataPermission);
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("鍒濆鍖栨暟鎹畨鍏ㄧ紦瀛樻椂鍑洪敊:{}", e.getMessage());
+ }
+ }
+
+ /**
+ * 鏍规嵁鏄犲皠璇彞 ID 鎴栫被鍚嶈幏鍙栧搴旂殑 DataPermission 娉ㄨВ瀵硅薄
+ *
+ * @param mapperId 鏄犲皠璇彞 ID
+ * @return DataPermission 娉ㄨВ瀵硅薄锛屽鏋滀笉瀛樺湪鍒欒繑鍥� null
+ */
+ public DataPermission getDataPermission(String mapperId) {
+ // 妫�鏌ヤ笂涓嬫枃涓槸鍚﹀寘鍚槧灏勮鍙� ID 瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄
+ if (DataPermissionHelper.getPermission() != null) {
+ return DataPermissionHelper.getPermission();
+ }
+ // 濡傛灉缂撳瓨涓笉鍖呭惈鏄犲皠璇彞 ID 瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄锛屽垯灏濊瘯浣跨敤绫诲悕浣滀负閿煡鎵�
+ String clazzName = mapperId.substring(0, mapperId.lastIndexOf("."));
+ if (dataPermissionCacheMap.containsKey(clazzName)) {
+ return dataPermissionCacheMap.get(clazzName);
+ }
+ return null;
+ }
+
+ /**
* 妫�鏌ョ粰瀹氱殑鏄犲皠璇彞 ID 鏄惁鏈夋晥锛屽嵆鏄惁鑳藉鎵惧埌瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄
*
+ * @param mapperId 鏄犲皠璇彞 ID
* @return 濡傛灉鎵惧埌瀵瑰簲鐨� DataPermission 娉ㄨВ瀵硅薄锛屽垯杩斿洖 false锛涘惁鍒欒繑鍥� true
*/
- public boolean invalid() {
- return DataPermissionHelper.getPermission() == null;
+ public boolean invalid(String mapperId) {
+ return getDataPermission(mapperId) == null;
}
+
}
diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
index 587a998..85a4d0a 100644
--- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
+++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java
@@ -39,9 +39,11 @@
/**
* 鏋勯�犲嚱鏁帮紝鍒濆鍖� PlusDataPermissionHandler 瀹炰緥
+ *
+ * @param mapperPackage 鎵弿鐨勬槧灏勫櫒鍖�
*/
- public PlusDataPermissionInterceptor() {
- this.dataPermissionHandler = new PlusDataPermissionHandler();
+ public PlusDataPermissionInterceptor(String mapperPackage) {
+ this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage);
}
/**
@@ -62,7 +64,7 @@
return;
}
// 妫�鏌ユ槸鍚︾己灏戞湁鏁堢殑鏁版嵁鏉冮檺娉ㄨВ
- if (dataPermissionHandler.invalid()) {
+ if (dataPermissionHandler.invalid(ms.getId())) {
return;
}
// 瑙f瀽 sql 鍒嗛厤瀵瑰簲鏂规硶
@@ -90,7 +92,7 @@
return;
}
// 妫�鏌ユ槸鍚︾己灏戞湁鏁堢殑鏁版嵁鏉冮檺娉ㄨВ
- if (dataPermissionHandler.invalid()) {
+ if (dataPermissionHandler.invalid(ms.getId())) {
return;
}
PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
--
Gitblit v1.9.3