|
@@ -5,6 +5,8 @@ package org.springblade.cube.service;
|
|
|
|
|
|
import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
@@ -13,10 +15,7 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.map.HashedMap;
|
|
|
import org.springblade.bi.client.form.ParamCondition;
|
|
|
import org.springblade.bi.client.form.SubTableQueryParam;
|
|
|
-import org.springblade.bi.client.form.param.JoinColumnItem;
|
|
|
-import org.springblade.bi.client.form.param.MasterTableColumnItem;
|
|
|
-import org.springblade.bi.client.form.param.TableLinkJoinItem;
|
|
|
-import org.springblade.bi.client.form.param.TableLinkJoinParam;
|
|
|
+import org.springblade.bi.client.form.param.*;
|
|
|
import org.springblade.bi.client.model.CubeBrowserSqlModel;
|
|
|
import org.springblade.core.mp.support.Query;
|
|
|
import org.springblade.core.secure.BladeUser;
|
|
@@ -81,15 +80,40 @@ public class CubeDataBrowserService {
|
|
|
|
|
|
@Autowired
|
|
|
private DialectContext dialectContext;
|
|
|
-
|
|
|
+ //${系统变量}
|
|
|
+ static private final String sql = "where ( ${permissionCubeColumnId1} = ${publicPermission} or ( ${userIdsCubeColumnId} like '%${userId}${userIdDelimiter}%' and ${permissionCubeColumnId2} = ${privatePermission} ) )";
|
|
|
+ //${系统变量}
|
|
|
+ static private final String permissionCubeColumnId1 = "\\$\\{permissionCubeColumnId1\\}";
|
|
|
+ static private final String publicPermission = "\\$\\{publicPermission\\}";
|
|
|
+ static private final String permissionCubeColumnId2 = "\\$\\{permissionCubeColumnId2\\}";
|
|
|
+ static private final String privatePermission = "\\$\\{privatePermission\\}";
|
|
|
+ static private final String userIdsCubeColumnId = "\\$\\{userIdsCubeColumnId\\}";
|
|
|
+ static private final String userId = "\\$\\{userId\\}";
|
|
|
+ static private final String userIdDelimiter = "\\$\\{userIdDelimiter\\}";
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // 创建一个Pattern对象,并编译一个正则表达式,用于匹配方括号内的内容
|
|
|
+ Pattern pattern = Pattern.compile(permissionCubeColumnId1);
|
|
|
+ // 创建Matcher对象
|
|
|
+ Matcher matcher = pattern.matcher(sql);
|
|
|
+ // 查找字符串中所有匹配的内容
|
|
|
+ while (matcher.find()) {
|
|
|
+ // 将匹配到的文本(不包括方括号)添加到List中
|
|
|
+ String s = sql.replace(matcher.group(), "2r");
|
|
|
+ System.out.println(s);
|
|
|
+ }
|
|
|
+ }
|
|
|
/**
|
|
|
+ * @param
|
|
|
* @param cubeId
|
|
|
* @param browserRequest
|
|
|
* @param bladeUser
|
|
|
- * @param
|
|
|
+ * @param rowPermissionParam
|
|
|
* @return
|
|
|
*/
|
|
|
- public CubeBrowserSqlModel buildSql(Integer cubeId, BrowserRequest browserRequest, BladeUser bladeUser) {
|
|
|
+ public CubeBrowserSqlModel buildSql(Integer cubeId,
|
|
|
+ BrowserRequest browserRequest,
|
|
|
+ BladeUser bladeUser,
|
|
|
+ RowPermissionParam rowPermissionParam) {
|
|
|
log.info("getUser={}", JSONUtil.toJsonStr(AuthUtil.getUser()));
|
|
|
// 获取分页model和查询参数model
|
|
|
List<BrowserParam> paramList = browserRequest.getParamList();
|
|
@@ -125,7 +149,10 @@ public class CubeDataBrowserService {
|
|
|
// 条件SQL
|
|
|
List<String> conditionSqlList = new ArrayList<String>();
|
|
|
Map<String, String> conditionSqlMap = new HashMap<>();
|
|
|
-
|
|
|
+ String rowPermissionSql = sql;
|
|
|
+ if (rowPermissionParam == null) {
|
|
|
+ rowPermissionSql = " where ";
|
|
|
+ }
|
|
|
Map<String, List<Object>> extraParams = querySqlService.buildGlobalParams(null, bladeUser);
|
|
|
// 行/列 权限
|
|
|
CubePermParseDto cubePermParseDto = cubeDataPermissionService.parseCubePermission(cubeId, bladeUser);
|
|
@@ -159,6 +186,10 @@ public class CubeDataBrowserService {
|
|
|
selectSqlList.add(selectColumnName + " as \"" + column.getColumnAliasName() + "\"");
|
|
|
// 是否包含在查询参数中
|
|
|
// BrowserParam browserParam = CollectionUtil.isNotEmpty(paramList) ? .findFirst().orElse(null) : null;
|
|
|
+ //开启表单行权限
|
|
|
+ if (rowPermissionParam != null) {
|
|
|
+ replaceRowPermissionParam(rowPermissionParam, column, queryColumnName,rowPermissionSql);
|
|
|
+ }
|
|
|
|
|
|
List<BrowserParam> collect = paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).collect(Collectors.toList());
|
|
|
if (CollectionUtil.isNotEmpty(collect)) {
|
|
@@ -192,7 +223,7 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
// 拼接查询条件
|
|
|
if (!conditionSqlList.isEmpty()) {
|
|
|
- querySqlBuilder.append(" where " + String.join(" AND ", conditionSqlList));
|
|
|
+ querySqlBuilder.append(rowPermissionSql).append(String.join(" AND ", conditionSqlList));
|
|
|
}
|
|
|
|
|
|
// ID和别名Map
|
|
@@ -203,7 +234,38 @@ public class CubeDataBrowserService {
|
|
|
return new CubeBrowserSqlModel(querySqlBuilder.toString(), columnDict);
|
|
|
}
|
|
|
|
|
|
- public CubeBrowserSqlModel buildSqlNotParamCondition(Integer cubeId, BrowserRequest browserRequest, BladeUser bladeUser, ParamCondition paramCondition) {
|
|
|
+ private static void replaceRowPermissionParam(RowPermissionParam rowPermissionParam, CubeTableColumn column, String queryColumnName,String rowPermissionSql) {
|
|
|
+
|
|
|
+ if (rowPermissionParam.getPermissionCubeColumnId().equals(column.getId())) {
|
|
|
+ replaceSql(permissionCubeColumnId1,queryColumnName, rowPermissionSql);
|
|
|
+ replaceSql(publicPermission,rowPermissionParam.getPublicPermission(), rowPermissionSql);
|
|
|
+ replaceSql(permissionCubeColumnId2,queryColumnName, rowPermissionSql);
|
|
|
+ replaceSql(privatePermission,rowPermissionParam.getPrivatePermission(), rowPermissionSql);
|
|
|
+ }
|
|
|
+ if (rowPermissionParam.getUserIdsCubeColumnId().equals(column.getId())) {
|
|
|
+ replaceSql(userIdsCubeColumnId,queryColumnName, rowPermissionSql);
|
|
|
+ replaceSql(userId,AuthUtil.getUserId()+"", rowPermissionSql);
|
|
|
+ replaceSql(userIdDelimiter,rowPermissionParam.getUserIdDelimiter(), rowPermissionSql);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void replaceSql(String rex, String value, String rowPermissionSql) {
|
|
|
+ // 创建一个Pattern对象,并编译一个正则表达式,用于匹配方括号内的内容
|
|
|
+ Pattern pattern = Pattern.compile(rex);
|
|
|
+ // 创建Matcher对象
|
|
|
+ Matcher matcher = pattern.matcher(rowPermissionSql);
|
|
|
+ // 查找字符串中所有匹配的内容
|
|
|
+ while (matcher.find()) {
|
|
|
+ // 将匹配到的文本(不包括方括号)添加到List中
|
|
|
+ rowPermissionSql = rowPermissionSql.replace(matcher.group(), value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public CubeBrowserSqlModel buildSqlNotParamCondition(Integer cubeId,
|
|
|
+ BrowserRequest browserRequest,
|
|
|
+ BladeUser bladeUser,
|
|
|
+ ParamCondition paramCondition,
|
|
|
+ RowPermissionParam rowPermissionParam) {
|
|
|
log.info("getUser={}", JSONUtil.toJsonStr(AuthUtil.getUser()));
|
|
|
// 获取分页model和查询参数model
|
|
|
List<BrowserParam> paramList = browserRequest.getParamList();
|
|
@@ -239,7 +301,10 @@ public class CubeDataBrowserService {
|
|
|
// 条件SQL
|
|
|
List<String> conditionSqlList = new ArrayList<String>();
|
|
|
Map<String, String> conditionSqlMap = new HashMap<>();
|
|
|
-
|
|
|
+ String rowPermissionSql = sql;
|
|
|
+ if (rowPermissionParam == null) {
|
|
|
+ rowPermissionSql = " where ";
|
|
|
+ }
|
|
|
Map<String, List<Object>> extraParams = querySqlService.buildGlobalParams(null, bladeUser);
|
|
|
// 行/列 权限
|
|
|
CubePermParseDto cubePermParseDto = cubeDataPermissionService.parseCubePermission(cubeId, bladeUser);
|
|
@@ -271,6 +336,10 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
}
|
|
|
selectSqlList.add(selectColumnName + " as \"" + column.getColumnAliasName() + "\"");
|
|
|
+ //开启表单行权限
|
|
|
+ if (rowPermissionParam != null) {
|
|
|
+ replaceRowPermissionParam(rowPermissionParam, column, queryColumnName,rowPermissionSql);
|
|
|
+ }
|
|
|
// 是否包含在查询参数中
|
|
|
// BrowserParam browserParam = CollectionUtil.isNotEmpty(paramList) ? paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).findFirst().orElse(null) : null;
|
|
|
List<BrowserParam> collect = paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).collect(Collectors.toList());
|
|
@@ -306,12 +375,12 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
// 拼接查询条件
|
|
|
if (!conditionSqlList.isEmpty()) {
|
|
|
- querySqlBuilder.append(" where " + String.join(" AND ", conditionSqlList));
|
|
|
+ querySqlBuilder.append(rowPermissionSql).append(String.join(" AND ", conditionSqlList));
|
|
|
}
|
|
|
// 拼接复杂查询条件
|
|
|
if (!conditionSqlMap.isEmpty()) {
|
|
|
if (conditionSqlList.isEmpty()) {
|
|
|
- querySqlBuilder.append(" where ");
|
|
|
+ querySqlBuilder.append(rowPermissionSql);
|
|
|
traverseConditions(paramCondition.getConditions(), paramCondition.getRelation(), conditionSqlMap, querySqlBuilder);
|
|
|
} else {
|
|
|
querySqlBuilder.append(" AND ");
|
|
@@ -347,13 +416,7 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public static void main(String[] args) {
|
|
|
- Integer[] ascArr = Func.toIntArray("123,321");
|
|
|
- System.out.println(Arrays.toString(ascArr));
|
|
|
- System.out.println();
|
|
|
- Integer[] ascArr2 = Func.toIntArray(null);
|
|
|
- System.out.println(Arrays.toString(ascArr2));
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* @param cubeId
|
|
@@ -362,7 +425,12 @@ public class CubeDataBrowserService {
|
|
|
* @param bladeUser
|
|
|
* @return
|
|
|
*/
|
|
|
- public CubeBrowserSqlModel buildSql(Integer cubeId, BrowserRequest browserRequest, TableLinkJoinParam tableLinkJoinParam, List<SubTableQueryParam> subTableQueryParams, BladeUser bladeUser) {
|
|
|
+ public CubeBrowserSqlModel buildSql(Integer cubeId,
|
|
|
+ BrowserRequest browserRequest,
|
|
|
+ TableLinkJoinParam tableLinkJoinParam,
|
|
|
+ List<SubTableQueryParam> subTableQueryParams,
|
|
|
+ BladeUser bladeUser,
|
|
|
+ RowPermissionParam rowPermissionParam) {
|
|
|
// 获取分页model和查询参数model
|
|
|
List<BrowserParam> paramList = browserRequest.getParamList();
|
|
|
Query query = browserRequest.getPageQuery();
|
|
@@ -391,7 +459,10 @@ public class CubeDataBrowserService {
|
|
|
List<String> selectSqlList = new ArrayList<String>();
|
|
|
// 条件SQL
|
|
|
List<String> conditionSqlList = new ArrayList<String>();
|
|
|
-
|
|
|
+ String rowPermissionSql = sql;
|
|
|
+ if (rowPermissionParam == null) {
|
|
|
+ rowPermissionSql = " where ";
|
|
|
+ }
|
|
|
Map<String, List<Object>> extraParams = querySqlService.buildGlobalParams(null, bladeUser);
|
|
|
// 行/列 权限
|
|
|
CubePermParseDto cubePermParseDto = cubeDataPermissionService.parseCubePermission(cubeId, bladeUser);
|
|
@@ -425,6 +496,10 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
}
|
|
|
selectSqlList.add(selectColumnName + " as \"" + tableColumnAlias + "\"");
|
|
|
+ //开启表单行权限
|
|
|
+ if (rowPermissionParam != null) {
|
|
|
+ replaceRowPermissionParam(rowPermissionParam, column, queryColumnName,rowPermissionSql);
|
|
|
+ }
|
|
|
// 是否包含在查询参数中
|
|
|
// BrowserParam browserParam = CollectionUtil.isNotEmpty(paramList) ? paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).findFirst().orElse(null) : null;
|
|
|
List<BrowserParam> collect = paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).collect(Collectors.toList());
|
|
@@ -476,7 +551,7 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
// 拼接查询条件
|
|
|
if (!conditionSqlList.isEmpty()) {
|
|
|
- querySqlBuilder.append(" where " + String.join(" AND ", conditionSqlList));
|
|
|
+ querySqlBuilder.append(rowPermissionSql).append(String.join(" AND ", conditionSqlList));
|
|
|
}
|
|
|
|
|
|
Map<String, String> extColumnDict = new HashMap<>();
|
|
@@ -500,7 +575,13 @@ public class CubeDataBrowserService {
|
|
|
return cubeBrowserSqlModel;
|
|
|
}
|
|
|
|
|
|
- public CubeBrowserSqlModel buildSqlNotParamCondition(Integer cubeId, BrowserRequest browserRequest, TableLinkJoinParam tableLinkJoinParam, List<SubTableQueryParam> subTableQueryParams, BladeUser bladeUser, ParamCondition paramCondition) {
|
|
|
+ public CubeBrowserSqlModel buildSqlNotParamCondition(Integer cubeId,
|
|
|
+ BrowserRequest browserRequest,
|
|
|
+ TableLinkJoinParam tableLinkJoinParam,
|
|
|
+ List<SubTableQueryParam> subTableQueryParams,
|
|
|
+ BladeUser bladeUser,
|
|
|
+ ParamCondition paramCondition,
|
|
|
+ RowPermissionParam rowPermissionParam) {
|
|
|
// 获取分页model和查询参数model
|
|
|
List<BrowserParam> paramList = browserRequest.getParamList();
|
|
|
Query query = browserRequest.getPageQuery();
|
|
@@ -534,7 +615,10 @@ public class CubeDataBrowserService {
|
|
|
// 行/列 权限
|
|
|
CubePermParseDto cubePermParseDto = cubeDataPermissionService.parseCubePermission(cubeId, bladeUser);
|
|
|
Set<Integer> excludeColumnIdSet = Optional.ofNullable(cubePermParseDto.getExcludeColumnIdList()).orElse(new HashSet<>());
|
|
|
-
|
|
|
+ String rowPermissionSql = sql;
|
|
|
+ if (rowPermissionParam == null) {
|
|
|
+ rowPermissionSql = " where ";
|
|
|
+ }
|
|
|
Map<Integer, String> masterTableColumnMap = new HashedMap<>();
|
|
|
for (CubeTableColumn column : columnList) {
|
|
|
masterTableColumnMap.put(column.getId(), column.getColumnName());
|
|
@@ -563,6 +647,10 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
}
|
|
|
selectSqlList.add(selectColumnName + " as \"" + tableColumnAlias + "\"");
|
|
|
+ //开启表单行权限
|
|
|
+ if (rowPermissionParam != null) {
|
|
|
+ replaceRowPermissionParam(rowPermissionParam, column, queryColumnName,rowPermissionSql);
|
|
|
+ }
|
|
|
// 是否包含在查询参数中
|
|
|
// BrowserParam browserParam = CollectionUtil.isNotEmpty(paramList) ? paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).findFirst().orElse(null) : null;
|
|
|
List<BrowserParam> collect = paramList.stream().filter(item -> item.getCubeColumnId().equals(column.getId())).collect(Collectors.toList());
|
|
@@ -616,12 +704,12 @@ public class CubeDataBrowserService {
|
|
|
}
|
|
|
// 拼接权限查询条件
|
|
|
if (!conditionSqlList.isEmpty()) {
|
|
|
- querySqlBuilder.append(" where " + String.join(" AND ", conditionSqlList));
|
|
|
+ querySqlBuilder.append(rowPermissionSql).append(String.join(" AND ", conditionSqlList));
|
|
|
}
|
|
|
// 拼接复杂查询条件
|
|
|
if (!conditionSqlMap.isEmpty()) {
|
|
|
if (conditionSqlList.isEmpty()) {
|
|
|
- querySqlBuilder.append(" where ");
|
|
|
+ querySqlBuilder.append(rowPermissionSql);
|
|
|
traverseConditions(paramCondition.getConditions(), paramCondition.getRelation(), conditionSqlMap, querySqlBuilder);
|
|
|
} else {
|
|
|
querySqlBuilder.append(" AND ");
|