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();