From 5a2621a030b8e4f437e2c37fc4021ee661f497c7 Mon Sep 17 00:00:00 2001
From: jasmine <362055143@qq.com>
Date: Wed, 2 Apr 2025 03:59:41 +0000
Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA=E6=9C=AC=E9=83=A8=E9=97=A8=E5=8F=8A=E4=BB=A5=E4=B8=8B?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E8=A1=A8=E8=BE=BE=E5=BC=8F?=
=?UTF-8?q?=20=E4=BB=A5=E6=94=AF=E6=8C=81PostgreSQL?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 6 +++
.../handler/DefaultDataPermissionHandler.java | 53 +++++++++++++++----
2 files changed, 48 insertions(+), 11 deletions(-)
diff --git a/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/pom.xml b/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/pom.xml
index 076b50fe..b133c59d 100644
--- a/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/pom.xml
+++ b/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/pom.xml
@@ -24,5 +24,11 @@
top.continew
continew-starter-extension-datapermission-core
+
+
+
+ top.continew
+ continew-starter-data-core
+
\ No newline at end of file
diff --git a/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/src/main/java/top/continew/starter/extension/datapermission/handler/DefaultDataPermissionHandler.java b/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/src/main/java/top/continew/starter/extension/datapermission/handler/DefaultDataPermissionHandler.java
index 7b71d698..0e309ea6 100644
--- a/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/src/main/java/top/continew/starter/extension/datapermission/handler/DefaultDataPermissionHandler.java
+++ b/continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/src/main/java/top/continew/starter/extension/datapermission/handler/DefaultDataPermissionHandler.java
@@ -16,36 +16,45 @@
package top.continew.starter.extension.datapermission.handler;
-import cn.hutool.core.text.CharSequenceUtil;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.sql.DataSource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
+
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.extra.spring.SpringUtil;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue;
+import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
+import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectItem;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import top.continew.starter.core.constant.StringConstants;
+import top.continew.starter.data.core.enums.DatabaseType;
+import top.continew.starter.data.core.util.MetaUtils;
import top.continew.starter.extension.datapermission.annotation.DataPermission;
import top.continew.starter.extension.datapermission.enums.DataScope;
import top.continew.starter.extension.datapermission.filter.DataPermissionUserContextProvider;
import top.continew.starter.extension.datapermission.model.RoleContext;
import top.continew.starter.extension.datapermission.model.UserContext;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Set;
-
/**
* 默认数据权限处理器
*
@@ -57,6 +66,7 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
private static final Logger log = LoggerFactory.getLogger(DefaultDataPermissionHandler.class);
private final DataPermissionUserContextProvider dataPermissionUserContextProvider;
+ private static final DataSource dataSource = SpringUtil.getBean(DataSource.class);
public DefaultDataPermissionHandler(DataPermissionUserContextProvider dataPermissionUserContextProvider) {
this.dataPermissionUserContextProvider = dataPermissionUserContextProvider;
@@ -133,13 +143,34 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
PlainSelect select = new PlainSelect();
select.setSelectItems(Collections.singletonList(new SelectItem<>(new Column(dataPermission.id()))));
select.setFromItem(new Table(dataPermission.deptTableAlias()));
+
EqualsTo equalsTo = new EqualsTo();
equalsTo.setLeftExpression(new Column(dataPermission.id()));
equalsTo.setRightExpression(new LongValue(userContext.getDeptId()));
- Function function = new Function();
- function.setName("find_in_set");
- function.setParameters(new ExpressionList<>(new LongValue(userContext.getDeptId()), new Column("ancestors")));
- select.setWhere(new OrExpression(equalsTo, function));
+
+ DatabaseType databaseType = MetaUtils.getDatabaseType(dataSource);
+ Expression inSetExpression;
+ if (DatabaseType.MYSQL.getDatabase().equalsIgnoreCase(databaseType.getDatabase())) {
+ Function findInSetFunction = new Function();
+ findInSetFunction.setName("find_in_set");
+ findInSetFunction.setParameters(new ExpressionList<>(new LongValue(userContext
+ .getDeptId()), new StringValue(new Column("ancestors") + ",")));
+ inSetExpression = findInSetFunction;
+ } else if (DatabaseType.POSTGRE_SQL.getDatabase().equalsIgnoreCase(databaseType.getDatabase())) {
+ // 构建 concat 函数
+ Function concatFunction = new Function("concat");
+ concatFunction.setParameters(new ExpressionList<>(new Column("ancestors"), new StringValue(",")));
+
+ // 创建 LIKE 函数
+ LikeExpression likeExpression = new LikeExpression();
+ likeExpression.setLeftExpression(concatFunction);
+ likeExpression.setRightExpression(new StringValue("%," + userContext.getDeptId() + ",%"));
+ inSetExpression = likeExpression;
+ } else {
+ throw new IllegalArgumentException("暂不支持 [%s] 数据权限".formatted(""));
+ }
+
+ select.setWhere(new OrExpression(equalsTo, inSetExpression));
subSelect.setSelect(select);
// 构建父查询
InExpression inExpression = new InExpression();