gaodandan лет назад: 7
Родитель
Сommit
e9c4de7f41
1 измененных файлов с 43 добавлено и 34 удалено
  1. 43 34
      src/main/java/com/chinaitop/depot/DatePermissionInterceptor.java

+ 43 - 34
src/main/java/com/chinaitop/depot/DatePermissionInterceptor.java

@@ -60,9 +60,9 @@ public class DatePermissionInterceptor implements Interceptor {
60
 		final BoundSql boundSql = statementHandler.getBoundSql();
60
 		final BoundSql boundSql = statementHandler.getBoundSql();
61
 		String bouString = boundSql.getSql();// 获取执行sql 
61
 		String bouString = boundSql.getSql();// 获取执行sql 
62
 		
62
 		
63
-		//sql是查询的才进行权限过滤
64
-	    if(mappedStatement.getSqlCommandType().toString().equals("select".toUpperCase())) {
65
-	    
63
+		//sql是查询的才进行权限过滤且不过滤t_url_config表的数据
64
+	    if(mappedStatement.getSqlCommandType().toString().equals("select".toUpperCase()) && 
65
+	    		!bouString.contains("t_url_config")) {
66
 			//通过本地线程获取库id
66
 			//通过本地线程获取库id
67
 			Object threadLocalObj = DataPolicyEngine.get();
67
 			Object threadLocalObj = DataPolicyEngine.get();
68
 			String orgId = null;
68
 			String orgId = null;
@@ -70,43 +70,52 @@ public class DatePermissionInterceptor implements Interceptor {
70
 				orgId = ObjectUtils.toString(threadLocalObj);
70
 				orgId = ObjectUtils.toString(threadLocalObj);
71
 			}
71
 			}
72
 			if(orgId!=null) {
72
 			if(orgId!=null) {
73
-				//解析sql中的表名
74
-				Statement statement = CCJSqlParserUtil.parse(bouString);
75
-			    Select selectStatement = (Select)statement;
76
-			    TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
77
-			    List<String> result = tablesNamesFinder.getTableList(selectStatement);
78
-				
79
-				Set<String> tableNames = new HashSet<String>();// 定义需要替换的table信息列表
80
-				//获取业务表信息数据
81
-				List<String> tableList = (List<String>)redisUtil.lGetAll("tableList").get(0);
82
-				for(int i=0;i<result.size();i++) {
83
-					for (int j = 0; j < tableList.size(); j++) {// 处理查看sql中是否有业务表
84
-						if (result.get(i).equals(ObjectUtils.toString(tableList.get(j)))) {// 是否存在业务表
85
-							tableNames.add(result.get(i));
73
+				//机构单独查询时使用递归查询,可以查询机构下级机构
74
+				if("com.chinaitop.depot.system.mapper.OrgInfoMapper.selectByExample".equals(mappedStatement.getId())) {
75
+					bouString = bouString.replaceAll("org_info", "(SELECT * from org_info"
76
+							+ " WHERE FIND_IN_SET(org_id,getChildrenOrg("+orgId+"))) org_info ");
77
+				}else {
78
+					//解析sql中的表名
79
+					Statement statement = CCJSqlParserUtil.parse(bouString);
80
+					Select selectStatement = (Select)statement;
81
+					TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
82
+					List<String> result = tablesNamesFinder.getTableList(selectStatement);
83
+					
84
+					Set<String> tableNames = new HashSet<String>();// 定义需要替换的table信息列表
85
+					//获取业务表信息数据
86
+					List<String> tableList = (List<String>)redisUtil.lGetAll("tableList").get(0);
87
+					for(int i=0;i<result.size();i++) {
88
+						for (int j = 0; j < tableList.size(); j++) {// 处理查看sql中是否有业务表
89
+							if (result.get(i).equals(ObjectUtils.toString(tableList.get(j)))) {// 是否存在业务表
90
+								tableNames.add(result.get(i));
91
+							}
86
 						}
92
 						}
87
 					}
93
 					}
88
-				}
89
-				
90
-				if (tableNames != null && tableNames.size() > 0) {// sql中存在业务表进行sql拼接数据重新检索
91
-					if(result.size() >= 2) {//sql中存在2张及以上表
92
-						for (String table : tableNames) {// 进行业务表的数据权限替换
93
-							table += " ";//表名后面加空格,防止两个表名一部分相似,导致替换出错
94
-							bouString = bouString.replaceAll(table, "(SELECT * from " + table
95
-									+ " WHERE org_id = '"+orgId+"') ");
96
-						}
97
-					}else {//sql中是单表
98
-						for (String table : tableNames) {// 进行业务表的数据权限替换
99
-							table += " ";//表名后面加空格,防止两个表名一部分相似,导致替换出错
100
-							bouString = bouString.replaceAll(table, "(SELECT * from " + table
101
-									+ " WHERE org_id = '"+orgId+"') "+table+" ");
94
+					
95
+					if (tableNames != null && tableNames.size() > 0) {// sql中存在业务表进行sql拼接数据重新检索
96
+						if(result.size() >= 2) {//sql中存在2张及以上表
97
+							for (String table : tableNames) {// 进行业务表的数据权限替换
98
+								table += " ";//表名后面加空格,防止两个表名一部分相似,导致替换出错
99
+								bouString = bouString.replaceAll(table, "(SELECT * from " + table
100
+										+ " WHERE org_id = '"+orgId+"') ");
101
+							}
102
+						}else {//sql中是单表
103
+							for (String table : tableNames) {// 进行业务表的数据权限替换
104
+								if(bouString.contains(table+" ")) {//防止是单表查询,表后面没有空格的时候替换不了
105
+									table += " ";//表名后面加空格,防止两个表名一部分相似,导致替换出错
106
+								}
107
+								bouString = bouString.replaceAll(table, "(SELECT * from " + table
108
+										+ " WHERE org_id = '"+orgId+"') "+table+" ");
109
+							}
102
 						}
110
 						}
111
+						
112
+						/*bouString = bouString.replaceAll(table, "(SELECT b.* from " + table
113
+						+ " b,user_business u WHERE b.org_id = u.org_id AND u .user_id ='"+userId+"' AND u.business_type = '"+table+"') ");*/
114
+						
103
 					}
115
 					}
104
-					
105
-					/*bouString = bouString.replaceAll(table, "(SELECT b.* from " + table
106
-							+ " b,user_business u WHERE b.org_id = u.org_id AND u .user_id ='"+userId+"' AND u.business_type = '"+table+"') ");*/
107
-					
108
 				}
116
 				}
109
 				
117
 				
118
+				
110
 				//metaStatementHandler.setValue("delegate.boundSql.sql", bouString);
119
 				//metaStatementHandler.setValue("delegate.boundSql.sql", bouString);
111
 				
120
 				
112
 				Field field = getField(boundSql, "sql");
121
 				Field field = getField(boundSql, "sql");