|
|
package com.tianbo.analysis.intercept;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.tianbo.analysis.thread.SessionUserContext;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import net.sf.jsqlparser.expression.Expression;
|
|
|
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
|
|
|
import net.sf.jsqlparser.schema.Column;
|
|
|
import net.sf.jsqlparser.schema.Table;
|
|
|
import net.sf.jsqlparser.statement.Statement;
|
|
|
import net.sf.jsqlparser.statement.select.Join;
|
|
|
import net.sf.jsqlparser.statement.select.PlainSelect;
|
|
|
import net.sf.jsqlparser.statement.select.Select;
|
|
|
import net.sf.jsqlparser.statement.select.SelectItem;
|
|
|
import net.sf.jsqlparser.statement.select.*;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.apache.ibatis.cache.CacheKey;
|
|
|
import org.apache.ibatis.executor.Executor;
|
|
|
import org.apache.ibatis.mapping.BoundSql;
|
...
|
...
|
@@ -25,9 +25,11 @@ import org.apache.ibatis.session.RowBounds; |
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
@Intercepts({
|
|
|
@Signature(type= Executor.class,
|
|
|
method = "query",
|
...
|
...
|
@@ -80,16 +82,33 @@ public class DataPermissionInterceptor implements Interceptor { |
|
|
* todo: 条件值怎么获取?
|
|
|
*/
|
|
|
String dataScope = "els";
|
|
|
JSONArray rowPermList = SessionUserContext.getSessionUser();
|
|
|
//取出来后 清理
|
|
|
SessionUserContext.clearSessionUser();
|
|
|
if (rowPermList!=null && !rowPermList.isEmpty()) {
|
|
|
// 用户配置了数据权限
|
|
|
//获取该用户所具有的角色的数据权限dataScope
|
|
|
dataScope = "usr";
|
|
|
}else {
|
|
|
//用户未配置数据权限
|
|
|
dataScope = "*";
|
|
|
JSONObject user = SessionUserContext.getSessionUser();
|
|
|
String username = user.getString("username");
|
|
|
Integer userId = user.getInteger("userId");
|
|
|
JSONArray dataPermissions = user.getJSONArray("dataPermissions");
|
|
|
//存储行条件数据权限
|
|
|
ArrayList<JSONObject> rowConditions = new ArrayList<>();
|
|
|
JSONArray colConditions = new JSONArray();
|
|
|
|
|
|
if (dataPermissions!=null && !dataPermissions.isEmpty()){
|
|
|
for (Object item : dataPermissions) {
|
|
|
JSONObject datapermission = (JSONObject) JSON.toJSON(item);
|
|
|
/**
|
|
|
* 一个组织绑定了同一个接口的多个数据权限,循环到这里 会出现 * 条件和 usr条件混乱,
|
|
|
* 目前 以循环 最后取到的row_condition为准,所以需要保持 数据权限配置数据正确
|
|
|
*/
|
|
|
dataScope = datapermission.getString("perm_type");
|
|
|
String colListStr = datapermission.getString("cols_list");
|
|
|
if (StringUtils.isNotEmpty(colListStr)){
|
|
|
if ("*".equals(colListStr)) {
|
|
|
//查询全部列,不改
|
|
|
}else{
|
|
|
JSONArray cloArrayList = JSONArray.parseArray(colListStr);
|
|
|
colConditions.addAll(cloArrayList);
|
|
|
}
|
|
|
}
|
|
|
rowConditions.add(datapermission);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
String deptsUser= "admin";
|
...
|
...
|
@@ -108,6 +127,7 @@ public class DataPermissionInterceptor implements Interceptor { |
|
|
PlainSelect plain = (PlainSelect) selectStatement.getSelectBody();
|
|
|
//获取所有外连接
|
|
|
List<Join> joins = plain.getJoins();
|
|
|
|
|
|
//获取到原始sql语句
|
|
|
String sql = processSql;
|
|
|
StringBuffer whereSql = new StringBuffer();
|
...
|
...
|
@@ -123,22 +143,22 @@ public class DataPermissionInterceptor implements Interceptor { |
|
|
case "usr":
|
|
|
if(joins==null || joins.isEmpty()){
|
|
|
String and = " and ";
|
|
|
for (int i = 0; i < rowPermList.size(); i++) {
|
|
|
JSONObject o = (JSONObject)rowPermList.get(i);
|
|
|
for (int i = 0; i < rowConditions.size(); i++) {
|
|
|
JSONObject dataPermission = rowConditions.get(i);
|
|
|
if (i==0){
|
|
|
whereSql
|
|
|
//条件字段
|
|
|
.append(o.get("colName"))
|
|
|
.append(dataPermission.get("row_condition"))
|
|
|
.append(" = ")
|
|
|
// 条件值
|
|
|
.append(getSqlValue(o.get("colValue")));
|
|
|
.append(getSqlValue(user.get(dataPermission.getString("row_condition_property"))));
|
|
|
}else {
|
|
|
whereSql.append(and)
|
|
|
//条件字段
|
|
|
.append(o.get("colName"))
|
|
|
.append(dataPermission.get("row_condition"))
|
|
|
.append(" = ")
|
|
|
// 条件值
|
|
|
.append(getSqlValue(o.get("colValue")));
|
|
|
.append(getSqlValue(user.get(dataPermission.getString("row_condition_property"))));
|
|
|
}
|
|
|
|
|
|
}
|
...
|
...
|
@@ -189,6 +209,13 @@ public class DataPermissionInterceptor implements Interceptor { |
|
|
whereSql.append("1=2");
|
|
|
break;
|
|
|
}
|
|
|
/**
|
|
|
* 替换select 节点
|
|
|
*/
|
|
|
if (!colConditions.isEmpty()){
|
|
|
List<SelectItem> selectExpressionItems = resetColumn(colConditions);
|
|
|
plain.setSelectItems(selectExpressionItems);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取where节点
|
...
|
...
|
@@ -240,4 +267,18 @@ public class DataPermissionInterceptor implements Interceptor { |
|
|
return value.toString();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 重新设置select的字段
|
|
|
* @param newSelectItems 要重设置的字段列表
|
|
|
* @return 重新设置后的字段列表
|
|
|
*/
|
|
|
private List<SelectItem> resetColumn(JSONArray newSelectItems){
|
|
|
List<SelectItem> newSelectExpressionItems = new ArrayList<>();
|
|
|
for (Object newSelectItem : newSelectItems) {
|
|
|
SelectItem selectExpressionItem = new SelectExpressionItem(new Column(newSelectItem.toString()));
|
|
|
newSelectExpressionItems.add(selectExpressionItem);
|
|
|
}
|
|
|
return newSelectExpressionItems;
|
|
|
}
|
|
|
} |
...
|
...
|
|