Explorar el Código

巨一行权限设置

wangrui hace 4 meses
padre
commit
abb48a90b7

+ 1 - 1
platomix-gmetry-bi-api/pom.xml

@@ -26,7 +26,7 @@
         <dependency>
             <groupId>com.platomix</groupId>
             <artifactId>platomix-gmetry-bi-client</artifactId>
-            <version>1.1.25</version>
+            <version>1.1.26</version>
         </dependency>
         <dependency>
             <groupId>com.platomix</groupId>

+ 1 - 1
platomix-gmetry-bi-api/src/main/java/org/springblade/cube/controller/CubeDataBrowserController.java

@@ -169,7 +169,7 @@ public class CubeDataBrowserController extends BladeController {
 //		Integer[] descArr = Func.toIntArray(query.getDescs());
 //		query.setDescs(Stream.of(descArr).filter(x -> x > 0).map(t -> columnDict.get(t)).collect(Collectors.joining(",")));
 			
-		CubeBrowserSqlModel cubeBrowserSqlModel = cubeDataBrowserService.buildSql(cubeId, browserRequest, getUser());
+		CubeBrowserSqlModel cubeBrowserSqlModel = cubeDataBrowserService.buildSql(cubeId, browserRequest, getUser(), null);
 		log.info("查询SQL:" + cubeBrowserSqlModel.getSql());
 		log.info("查询cubeBrowserSqlModel:" + JSONUtil.toJsonStr(cubeBrowserSqlModel));
 		//分页查询

+ 115 - 27
platomix-gmetry-bi-api/src/main/java/org/springblade/cube/service/CubeDataBrowserService.java

@@ -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 ");

+ 6 - 4
platomix-gmetry-bi-api/src/main/java/org/springblade/resouces/CubeDataResouce.java

@@ -9,6 +9,7 @@ import org.springblade.bi.client.CubeDataClient;
 import org.springblade.bi.client.form.AggCubeCreateForm;
 import org.springblade.bi.client.form.ChangeCubeDataStatusParams;
 import org.springblade.bi.client.form.CubeBrowserSqlForm;
+import org.springblade.bi.client.form.param.RowPermissionParam;
 import org.springblade.bi.client.model.CubeBrowserSqlModel;
 import org.springblade.bi.client.model.CubeDataModel;
 import org.springblade.core.mp.support.Query;
@@ -66,17 +67,18 @@ public class CubeDataResouce implements CubeDataClient {
 			browserRequest.setPageQuery(pageQuery);
 			browserRequest.setParamList(BeanUtil.copyToList(browserSqlForm.getParamList(), BrowserParam.class));
 
+            RowPermissionParam rowPermissionParam = browserSqlForm.getRowPermissionParam();
             if (browserSqlForm.getParamCondition()!=null){
                 log.info("buildBrowserSql params:{}", JSONUtil.toJsonStr(browserSqlForm));
 
                 return browserSqlForm.getTableLinkJoinParam() != null
-                        ? cubeDataBrowserService.buildSqlNotParamCondition(browserSqlForm.getCubeId(), browserRequest, browserSqlForm.getTableLinkJoinParam(),browserSqlForm.getSubTableQueryParams(), bladeUser,browserSqlForm.getParamCondition())
-                        : cubeDataBrowserService.buildSqlNotParamCondition(browserSqlForm.getCubeId(), browserRequest, bladeUser,browserSqlForm.getParamCondition());
+                        ? cubeDataBrowserService.buildSqlNotParamCondition(browserSqlForm.getCubeId(), browserRequest, browserSqlForm.getTableLinkJoinParam(),browserSqlForm.getSubTableQueryParams(), bladeUser,browserSqlForm.getParamCondition(),rowPermissionParam)
+                        : cubeDataBrowserService.buildSqlNotParamCondition(browserSqlForm.getCubeId(), browserRequest, bladeUser,browserSqlForm.getParamCondition(),rowPermissionParam);
             }
             log.info("buildBrowserSql tableLinkJoinParam:{}", JSONUtil.toJsonStr(browserSqlForm));
 			return browserSqlForm.getTableLinkJoinParam() != null 
-					? cubeDataBrowserService.buildSql(browserSqlForm.getCubeId(), browserRequest, browserSqlForm.getTableLinkJoinParam(),browserSqlForm.getSubTableQueryParams(), bladeUser)
-					: cubeDataBrowserService.buildSql(browserSqlForm.getCubeId(), browserRequest, bladeUser);
+					? cubeDataBrowserService.buildSql(browserSqlForm.getCubeId(), browserRequest, browserSqlForm.getTableLinkJoinParam(),browserSqlForm.getSubTableQueryParams(), bladeUser,rowPermissionParam)
+					: cubeDataBrowserService.buildSql(browserSqlForm.getCubeId(), browserRequest, bladeUser,rowPermissionParam);
 		} catch (Exception e) {
 			throw new RpcException(e.getMessage(), e);
 		}

+ 1 - 1
platomix-gmetry-bi-client/pom.xml

@@ -8,7 +8,7 @@
 		<version>1.0.0</version>
 	</parent>
 	<artifactId>platomix-gmetry-bi-client</artifactId>
-	<version>1.1.25</version>
+	<version>1.1.26</version>
 
 	<dependencies>
 		<dependency>

+ 5 - 0
platomix-gmetry-bi-client/src/main/java/org/springblade/bi/client/form/CubeBrowserSqlForm.java

@@ -7,6 +7,7 @@ import java.io.Serializable;
 import java.util.List;
 
 import lombok.ToString;
+import org.springblade.bi.client.form.param.RowPermissionParam;
 import org.springblade.bi.client.form.param.TableLinkJoinParam;
 
 import lombok.Data;
@@ -68,4 +69,8 @@ public class CubeBrowserSqlForm implements Serializable {
      */
     private ParamCondition paramCondition;
 
+    /**
+     * 行权限参数
+     */
+    private RowPermissionParam rowPermissionParam;
 }

+ 50 - 0
platomix-gmetry-bi-client/src/main/java/org/springblade/bi/client/form/param/RowPermissionParam.java

@@ -0,0 +1,50 @@
+/**
+ * 
+ */
+package org.springblade.bi.client.form.param;
+
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @author wookvn
+ *
+ */
+@Data
+@ToString(includeFieldNames = false)
+public class RowPermissionParam implements Serializable {
+
+	/**
+	 * sql:where  ( rermission  = '公开' or ( userid like %zs% and rermission = '私有' )  )
+	 * sql:where  ( ${permissionCubeColumnId}  = ${publicPermission} or ( ${userIdsCubeColumnId} like '%${userId}${userIdDelimiter}%' and ${permissionCubeColumnId} = ${privatePermission} )  )
+	 */
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 权限用户ids 数据集字段ID
+	 */
+	private Integer userIdsCubeColumnId;
+
+	/**
+	 * 权限用户ids 分隔符
+	 */
+	private String userIdDelimiter;
+
+	/**
+	 * 公开私有 数据集字段ID
+	 */
+	private Integer permissionCubeColumnId;
+
+	/**
+	 * 公开
+	 */
+	private String publicPermission;
+
+	/**
+	 * 私有
+	 */
+	private String  privatePermission;
+}