Forráskód Böngészése

!258 修改多表数据权限插件,增加当前where条件参数
Merge pull request !258 from 侯坤林/3.0

青苗 2 éve
szülő
commit
da0d9f0ba4

+ 3 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/handler/MultiDataPermissionHandler.java

@@ -42,11 +42,12 @@ public interface MultiDataPermissionHandler extends DataPermissionHandler {
     /**
      * 获取数据权限 SQL 片段。
      * <p>旧的 {@link MultiDataPermissionHandler#getSqlSegment(Expression, String)} 方法第一个参数包含所有的 where 条件信息,如果 return 了 null 会覆盖原有的 where 数据,</p>
-     * <p>新版的 {@link MultiDataPermissionHandler#getSqlSegment(Table, String)} 方法不能覆盖原有的 where 数据,如果 return 了 null 则表示不追加任何 where 条件</p>
+     * <p>新版的 {@link MultiDataPermissionHandler#getSqlSegment(Table, Expression, String)} 方法不能覆盖原有的 where 数据,如果 return 了 null 则表示不追加任何 where 条件</p>
      *
      * @param table             所执行的数据库表信息,可以通过此参数获取表名和表别名
+     * @param where             原有的 where 条件信息
      * @param mappedStatementId Mybatis MappedStatement Id 根据该参数可以判断具体执行方法
      * @return JSqlParser 条件表达式,返回的条件表达式会拼接在原有的表达式后面(不会覆盖原有的表达式)
      */
-    Expression getSqlSegment(final Table table, final String mappedStatementId);
+    Expression getSqlSegment(final Table table, final Expression where, final String mappedStatementId);
 }

+ 4 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/BaseMultiTableInnerInterceptor.java

@@ -69,7 +69,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
      */
     protected Expression andExpression(Table table, Expression where, final String whereSegment) {
         //获得where条件表达式
-        final Expression expression = buildTableExpression(table, whereSegment);
+        final Expression expression = buildTableExpression(table, where, whereSegment);
         if (null != where) {
             if (where instanceof OrExpression) {
                 return new AndExpression(expression, new Parenthesis(where));
@@ -381,7 +381,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
         }
         // 构造每张表的条件
         List<Expression> expressions = tables.stream()
-            .map(item -> buildTableExpression(item, whereSegment))
+            .map(item -> buildTableExpression(item, currentExpression, whereSegment))
             .filter(Objects::nonNull)
             .collect(Collectors.toList());
 
@@ -413,8 +413,9 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i
      * 构建数据库表的查询条件
      *
      * @param table        表对象
+     * @param where        当前where条件
      * @param whereSegment 所属Mapper对象全路径
      * @return 需要拼接的新条件(不会覆盖原有的where条件,只会在原有条件上再加条件),为 null 则不加入新的条件
      */
-    public abstract Expression buildTableExpression(final Table table, final String whereSegment);
+    public abstract Expression buildTableExpression(final Table table, final Expression where, final String whereSegment);
 }

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataPermissionInterceptor.java

@@ -140,9 +140,9 @@ public class DataPermissionInterceptor extends BaseMultiTableInnerInterceptor im
     }
 
     @Override
-    public Expression buildTableExpression(final Table table, final String whereSegment) {
+    public Expression buildTableExpression(final Table table, final Expression where, final String whereSegment) {
         // 只有新版数据权限处理器才会执行到这里
         final MultiDataPermissionHandler handler = (MultiDataPermissionHandler) dataPermissionHandler;
-        return handler.getSqlSegment(table, whereSegment);
+        return handler.getSqlSegment(table, where, whereSegment);
     }
 }

+ 3 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -230,11 +230,13 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
      * 构建租户条件表达式
      *
      * @param table        表对象
+     * @param where        当前where条件
      * @param whereSegment 所属Mapper对象全路径(在原租户拦截器功能中,这个参数并不需要参与相关判断)
      * @return 租户条件表达式
+     * @see BaseMultiTableInnerInterceptor#buildTableExpression(Table, Expression, String)
      */
     @Override
-    public Expression buildTableExpression(final Table table, final String whereSegment) {
+    public Expression buildTableExpression(final Table table, final Expression where, final String whereSegment) {
         if (tenantLineHandler.ignoreTable(table.getName())) {
             return null;
         }

+ 1 - 1
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/inner/MultiDataPermissionInterceptorTest.java

@@ -47,7 +47,7 @@ public class MultiDataPermissionInterceptorTest {
         interceptor = new DataPermissionInterceptor(new MultiDataPermissionHandler() {
 
             @Override
-            public Expression getSqlSegment(final Table table, final String mappedStatementId) {
+            public Expression getSqlSegment(final Table table, final Expression where, final String mappedStatementId) {
                 try {
                     String sqlSegment = sqlSegmentMap.get(mappedStatementId, table.getName());
                     if (sqlSegment == null) {