diff --git a/README.md b/README.md index a6de8f8..9e148bf 100644 --- a/README.md +++ b/README.md @@ -36,9 +36,9 @@ mybatis: ignore-table-name: # - user - user_role - ignore-match-table-name - # 匹配判断指定表名称是否忽略表按租户ID过滤(区分大小写匹配判断) - - temp # tempTableName + ignore-match-table-alias + # 匹配判断指定表别名称是否忽略表按租户ID过滤(区分大小写匹配判断) + - temp # tempTableAlias # 数据库中租户ID的列名 tenant-id-column: tenant_id # 是否使用druid过滤器方式修改sql,依赖druid数据库连接池,需要禁用enable=false diff --git a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/handler/TenantInfoHandler.java b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/handler/TenantInfoHandler.java index 3d03979..099f1bc 100644 --- a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/handler/TenantInfoHandler.java +++ b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/handler/TenantInfoHandler.java @@ -38,11 +38,11 @@ public interface TenantInfoHandler { List ignoreTableName(); /** - * 根据表名判断是否包含此字符串忽略拼接多租户ID条件(匹配判断) + * 根据表别名判断是否包含此字符串忽略拼接多租户ID条件(匹配判断) * - * @return 返回 忽略的包含的表名称 + * @return 返回 忽略的包含的表别名 */ - List ignoreMatchTableName(); + List ignoreMatchTableAlias(); /** * 获取租户字段名 diff --git a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/parser/DefaultSqlParser.java b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/parser/DefaultSqlParser.java index 00c2d64..5e39171 100644 --- a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/parser/DefaultSqlParser.java +++ b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/parser/DefaultSqlParser.java @@ -356,7 +356,7 @@ private void whereIn(SQLExpr sqlExpr) { * @return 返回条件 */ private SQLExpr getTenantCondition(String tableName, String alias, SQLExpr condition) { - if (isContainsTenantIdCondition(condition) || ignoreTable(tableName)) { + if (isContainsTenantIdCondition(condition) || ignoreTable(tableName) || ignoreTableAlias(alias)) { return null; } List tenantIds = this.tenantInfoHandler.getTenantIds(); @@ -441,28 +441,47 @@ private boolean isContainsTenantIdCondition(SQLExpr where) { return isContainsTenantIdCondition; } + /** + * 根据表名判断是否需要忽略 + * + * @param tableName 表名 + * @return + */ private boolean ignoreTable(String tableName) { if (tableName == null) { return false; } - String ignoreTableName = tableName.replace("`", ""); + tableName = tableName.replace("`", ""); List ignoreTableNames = tenantInfoHandler.ignoreTableName(); - List ignoreMatchTableNames = tenantInfoHandler.ignoreMatchTableName(); - if (isEmpty(ignoreTableNames) && isEmpty(ignoreMatchTableNames)) { + if (ignoreTableNames == null || ignoreTableNames.size() == 0) { return false; - } else { - boolean ignore = false; - if (!isEmpty(ignoreTableNames)) { - ignore = ignoreTableNames.contains(ignoreTableName); - } - if (ignore) { + } + for (String ignoreTableName : ignoreTableNames) { + if (tableName.equals(ignoreTableName)) { return true; } - if (!isEmpty(ignoreMatchTableNames)) { - ignore = ignoreMatchTableNames.stream().allMatch(ignoreTableName::contains); - } - return ignore; + } + return false; + } + + /** + * 根据表别名判断是否需要忽略 + * + * @param tableAlias 表别名 + * @return + */ + private boolean ignoreTableAlias(String tableAlias) { + if (tableAlias == null) { + return false; + } + + List ignoreMatchTableAlias = tenantInfoHandler.ignoreMatchTableAlias(); + + if (isEmpty(ignoreMatchTableAlias)) { + return false; + } else { + return ignoreMatchTableAlias.stream().allMatch(tableAlias::contains); } } diff --git a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/StartSysListener.java b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/StartSysListener.java index 40a8d60..f0810bd 100644 --- a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/StartSysListener.java +++ b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/StartSysListener.java @@ -49,8 +49,8 @@ public List ignoreTableName() { } @Override - public List ignoreMatchTableName() { - return tenantProperties.getIgnoreMatchTableName(); + public List ignoreMatchTableAlias() { + return tenantProperties.getIgnoreMatchTableAlias(); } @Override diff --git a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/TenantProperties.java b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/TenantProperties.java index 673f31c..ecb84f2 100644 --- a/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/TenantProperties.java +++ b/src/main/java/com/github/osinn/druid/multi/tenant/plugin/starter/TenantProperties.java @@ -32,9 +32,9 @@ public class TenantProperties { private List ignoreTableName = new ArrayList<>(); /** - * 匹配判断指定表名称是否忽略表按租户ID过滤(区分大小写匹配判断) + * 匹配判断指定表别名是否忽略表按租户ID过滤(区分大小写匹配判断) */ - private List ignoreMatchTableName = new ArrayList<>(); + private List ignoreMatchTableAlias = new ArrayList<>(); /** * 是否使用MyBatis拦截器方式修改sql,需要禁用druidFilterEnable diff --git a/src/test/java/com/github/osinn/osinn/sqlparser/test/TenantDemo.java b/src/test/java/com/github/osinn/osinn/sqlparser/test/TenantDemo.java index 0b0681f..4eff89e 100644 --- a/src/test/java/com/github/osinn/osinn/sqlparser/test/TenantDemo.java +++ b/src/test/java/com/github/osinn/osinn/sqlparser/test/TenantDemo.java @@ -73,6 +73,14 @@ public class TenantDemo { "SELECT vehicle_id AS vid,MAX(created_time) AS time1 FROM tbl_vehicle_maintenance WHERE deleted=0 GROUP BY vehicle_id) vl1 ON vl.vehicle_id=vl1.vid AND vl.created_time=vl1.time1 WHERE vl1.vid IN ('11122','3333') GROUP BY vl.vehicle_id,vl.created_time)"; + private static final String sql38 = "SELECT t2.*FROM (\n" + + "SELECT @r AS _id,(\n" + + "SELECT @r :=parent_id FROM tbl_dept WHERE id=_id) AS parent_id,@s :=@s+1 AS sort FROM (\n" + + "SELECT @r :=32,@s :=0) temp,tbl_dept WHERE @r> 0) temp1 JOIN tbl_dept t2 ON temp1._id=t2.id AND t2.cp_delete=0 ORDER BY temp1.sort DESC"; + + private static final String sql39 = "SELECT id, name,tenant_id FROM role temp"; + + public static void main(String[] args) { DefaultSqlParser defaultSqlParser = new DefaultSqlParser(); defaultSqlParser.setTenantInfoHandler(new TenantInfoHandler() { @@ -97,8 +105,10 @@ public List ignoreTableName() { } @Override - public List ignoreMatchTableName() { - return new ArrayList<>(); + public List ignoreMatchTableAlias() { + List objects = new ArrayList<>(); + objects.add("temp"); + return objects; } @Override @@ -180,6 +190,10 @@ public String getTenantIdColumn() { System.out.println(defaultSqlParser.setTenantParameter(sql36)); System.out.println("------------------------------------- \n"); System.out.println(defaultSqlParser.setTenantParameter(sql37)); + System.out.println("------------------------------------- \n"); + System.out.println(defaultSqlParser.setTenantParameter(sql38)); + System.out.println("------------------------------------- \n"); + System.out.println(defaultSqlParser.setTenantParameter(sql39)); } }