Skip to content

Commit

Permalink
修复根据别名忽略租户ID错误
Browse files Browse the repository at this point in the history
  • Loading branch information
wency_cai committed Jan 13, 2023
1 parent a90856f commit 24a6458
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 26 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ public interface TenantInfoHandler {
List<String> ignoreTableName();

/**
* 根据表名判断是否包含此字符串忽略拼接多租户ID条件(匹配判断)
* 根据表别名判断是否包含此字符串忽略拼接多租户ID条件(匹配判断)
*
* @return 返回 忽略的包含的表名称
* @return 返回 忽略的包含的表别名
*/
List<String> ignoreMatchTableName();
List<String> ignoreMatchTableAlias();

/**
* 获取租户字段名
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object> tenantIds = this.tenantInfoHandler.getTenantIds();
Expand Down Expand Up @@ -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<String> ignoreTableNames = tenantInfoHandler.ignoreTableName();
List<String> 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<String> ignoreMatchTableAlias = tenantInfoHandler.ignoreMatchTableAlias();

if (isEmpty(ignoreMatchTableAlias)) {
return false;
} else {
return ignoreMatchTableAlias.stream().allMatch(tableAlias::contains);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ public List<String> ignoreTableName() {
}

@Override
public List<String> ignoreMatchTableName() {
return tenantProperties.getIgnoreMatchTableName();
public List<String> ignoreMatchTableAlias() {
return tenantProperties.getIgnoreMatchTableAlias();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ public class TenantProperties {
private List<String> ignoreTableName = new ArrayList<>();

/**
* 匹配判断指定表名称是否忽略表按租户ID过滤(区分大小写匹配判断)
* 匹配判断指定表别名是否忽略表按租户ID过滤(区分大小写匹配判断)
*/
private List<String> ignoreMatchTableName = new ArrayList<>();
private List<String> ignoreMatchTableAlias = new ArrayList<>();

/**
* 是否使用MyBatis拦截器方式修改sql,需要禁用druidFilterEnable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -97,8 +105,10 @@ public List<String> ignoreTableName() {
}

@Override
public List<String> ignoreMatchTableName() {
return new ArrayList<>();
public List<String> ignoreMatchTableAlias() {
List<String> objects = new ArrayList<>();
objects.add("temp");
return objects;
}

@Override
Expand Down Expand Up @@ -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));

}
}

0 comments on commit 24a6458

Please sign in to comment.