Skip to content

Commit c6eac20

Browse files
committed
add TableColumnAliasContext
1 parent db0b66f commit c6eac20

File tree

10 files changed

+364
-178
lines changed

10 files changed

+364
-178
lines changed

springboot-starter-data-authorization/src/main/java/com/codingapi/springboot/authorization/DataAuthorizationContext.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,50 @@ private DataAuthorizationContext() {
2323
this.filters = new ArrayList<>();
2424
}
2525

26+
/**
27+
* 添加数据权限过滤器
28+
* @param filter 数据权限过滤器
29+
*/
2630
public void addDataAuthorizationFilter(DataAuthorizationFilter filter) {
2731
this.filters.add(filter);
2832
}
2933

34+
/**
35+
* 清空数据权限过滤器
36+
*/
3037
public void clearDataAuthorizationFilters() {
3138
this.filters.clear();
3239
}
3340

41+
/**
42+
* 列权限
43+
* @param interceptState 拦截状态
44+
* @param tableName 表名(或别名)
45+
* @param columnName 列名 (或别名)
46+
* @param value 值
47+
* @return T
48+
* @param <T> 泛型
49+
*/
3450
public <T> T columnAuthorization(SQLInterceptState interceptState, String tableName, String columnName, T value) {
3551
if (interceptState != null && interceptState.hasIntercept()) {
36-
// String realTableName = interceptState.getTableName(tableName);
52+
String realTableName = interceptState.getTableName(tableName);
53+
String realColumnName = interceptState.getColumnName(tableName,columnName);
54+
3755
for (DataAuthorizationFilter filter : filters) {
38-
if (filter.supportColumnAuthorization(tableName, columnName, value)) {
39-
return filter.columnAuthorization(tableName, columnName, value);
56+
if (filter.supportColumnAuthorization(realTableName, realColumnName, value)) {
57+
return filter.columnAuthorization(realTableName, realColumnName, value);
4058
}
4159
}
4260
}
4361
return value;
4462
}
4563

64+
/**
65+
* 行权限
66+
* @param tableName 表名
67+
* @param tableAlias 别名
68+
* @return Condition 增加的过滤条件
69+
*/
4670
public Condition rowAuthorization(String tableName, String tableAlias) {
4771
if (StringUtils.hasText(tableName) && StringUtils.hasText(tableAlias)) {
4872
for (DataAuthorizationFilter filter : filters) {

springboot-starter-data-authorization/src/main/java/com/codingapi/springboot/authorization/enhancer/DataPermissionSQLEnhancer.java

Lines changed: 21 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@
33

44
import com.codingapi.springboot.authorization.handler.Condition;
55
import com.codingapi.springboot.authorization.handler.RowHandler;
6-
import lombok.Getter;
7-
import net.sf.jsqlparser.expression.Alias;
86
import net.sf.jsqlparser.expression.Expression;
97
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
108
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
11-
import net.sf.jsqlparser.schema.Column;
129
import net.sf.jsqlparser.schema.Table;
1310
import net.sf.jsqlparser.statement.Statement;
14-
import net.sf.jsqlparser.statement.select.*;
11+
import net.sf.jsqlparser.statement.select.FromItem;
12+
import net.sf.jsqlparser.statement.select.Join;
13+
import net.sf.jsqlparser.statement.select.PlainSelect;
14+
import net.sf.jsqlparser.statement.select.Select;
1515

1616
import java.sql.SQLException;
17-
import java.util.HashMap;
18-
import java.util.List;
19-
import java.util.Map;
2017

2118
/**
2219
* 数据权限 SQL 增强器
@@ -25,32 +22,31 @@ public class DataPermissionSQLEnhancer {
2522

2623
private final String sql;
2724
private final RowHandler rowHandler;
25+
private final TableColumnAliasHolder tableColumnAliasHolder;
26+
private final Statement statement;
2827

29-
@Getter
30-
private final Map<String, String> tableAlias;
31-
32-
private final TableColumnAliasContext aliasContext;
3328

3429
// 构造函数
35-
public DataPermissionSQLEnhancer(String sql, RowHandler rowHandler) {
36-
// 如何sql中存在? 则在?后面添加空格
37-
this.sql = sql.replaceAll("\\?", " ? ");
38-
this.rowHandler = rowHandler;
39-
this.tableAlias = new HashMap<>();
40-
this.aliasContext = new TableColumnAliasContext();
30+
public DataPermissionSQLEnhancer(String sql, RowHandler rowHandler) throws SQLException {
31+
try {
32+
// 如何sql中存在? 则在?后面添加空格
33+
this.sql = sql.replaceAll("\\?", " ? ");
34+
this.rowHandler = rowHandler;
35+
this.statement = CCJSqlParserUtil.parse(this.sql);
36+
this.tableColumnAliasHolder = new TableColumnAliasHolder(statement);
37+
} catch (Exception e) {
38+
throw new SQLException(e);
39+
}
4140
}
4241

4342
// 获取增强后的SQL
4443
public String getNewSQL() throws SQLException {
4544
try {
46-
Statement statement = CCJSqlParserUtil.parse(sql);
4745
if (statement instanceof Select) {
46+
tableColumnAliasHolder.holderAlias();
4847
Select select = (Select) statement;
4948
PlainSelect plainSelect = select.getPlainSelect();
5049
this.enhanceDataPermissionInSelect(plainSelect);
51-
this.appendColumnAlias(plainSelect.getSelectItems());
52-
aliasContext.print();
53-
System.out.println(tableAlias);
5450
return statement.toString();
5551
}
5652
} catch (Exception e) {
@@ -59,6 +55,10 @@ public String getNewSQL() throws SQLException {
5955
return sql;
6056
}
6157

58+
public TableColumnAliasContext getTableAlias() {
59+
return tableColumnAliasHolder.getAliasContext();
60+
}
61+
6262

6363
// 增强 SELECT 语句
6464
private void enhanceDataPermissionInSelect(PlainSelect plainSelect) throws Exception {
@@ -67,13 +67,11 @@ private void enhanceDataPermissionInSelect(PlainSelect plainSelect) throws Excep
6767
// FROM 项是表
6868
if (fromItem instanceof Table) {
6969
Table table = (Table) fromItem;
70-
this.appendTableAlias(fromItem);
7170
this.injectDataPermissionCondition(plainSelect, table, plainSelect.getWhere());
7271
}
7372

7473
// FROM是子查询
7574
if (fromItem instanceof Select) {
76-
this.appendTableAlias(fromItem);
7775
PlainSelect subPlainSelect = ((Select) fromItem).getPlainSelect();
7876
this.enhanceDataPermissionInSelect(subPlainSelect);
7977
}
@@ -83,65 +81,20 @@ private void enhanceDataPermissionInSelect(PlainSelect plainSelect) throws Excep
8381
for (Join join : plainSelect.getJoins()) {
8482
if (join.getRightItem() instanceof Select) {
8583
PlainSelect subPlainSelect = ((Select) join.getRightItem()).getPlainSelect();
86-
this.appendTableAlias(join.getRightItem());
8784
this.enhanceDataPermissionInSelect(subPlainSelect);
8885
}
8986
if (join.getRightItem() instanceof Table) {
90-
this.appendTableAlias(join.getRightItem());
9187
injectDataPermissionCondition(plainSelect, (Table) join.getRightItem(), plainSelect.getWhere());
9288
}
9389
}
9490
}
9591
}
9692

9793

98-
private void appendTableAlias(FromItem fromItem) {
99-
if (fromItem instanceof Table) {
100-
Table table = (Table) fromItem;
101-
Alias alias = table.getAlias();
102-
String aliasName = alias.getName();
103-
aliasContext.add(aliasName, table.getName());
104-
}
105-
if (fromItem instanceof Select) {
106-
Select select = (Select) fromItem;
107-
PlainSelect plainSelect = select.getPlainSelect();
108-
this.appendTableAlias(plainSelect.getFromItem());
109-
List<Join> joins = plainSelect.getJoins();
110-
if (joins != null) {
111-
for (Join join : joins) {
112-
if (join.getRightItem() instanceof Table) {
113-
this.appendTableAlias(join.getRightItem());
114-
}
115-
if (join.getRightItem() instanceof Select) {
116-
this.appendTableAlias(join.getRightItem());
117-
}
118-
}
119-
}
120-
this.appendColumnAlias(plainSelect.getSelectItems());
121-
}
122-
123-
}
124-
125-
126-
private void appendColumnAlias(List<SelectItem<?>> selectItems) {
127-
if (selectItems != null) {
128-
for (SelectItem<?> selectItem : selectItems) {
129-
if (selectItem.getExpression() instanceof Column) {
130-
Column column = (Column) selectItem.getExpression();
131-
String aliasName = column.getTable().getName();
132-
String columnName = column.getColumnName();
133-
aliasContext.add(aliasName, columnName);
134-
}
135-
}
136-
}
137-
}
138-
139-
14094
// 注入数据权限条件
14195
private void injectDataPermissionCondition(PlainSelect plainSelect, Table table, Expression where) throws Exception {
14296
String tableName = table.getName();
14397
String aliaName = table.getAlias() != null ? table.getAlias().getName() : tableName;
144-
tableAlias.put(aliaName, tableName);
14598
Condition condition = rowHandler.handler(plainSelect.toString(), tableName, aliaName);
14699
if (condition != null) {
147100
// 添加自定义条件
Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,62 @@
11
package com.codingapi.springboot.authorization.enhancer;
22

3-
import java.util.HashMap;
3+
import lombok.Getter;
4+
45
import java.util.Map;
56

7+
/**
8+
* 表字段别名
9+
*/
610
public class TableColumnAlias {
711

8-
private final String aliasName;
12+
private final String parent;
13+
@Getter
14+
private final String tableName;
15+
@Getter
916
private final String columnName;
17+
private final String aliasName;
1018

11-
private Map<String,TableColumnAlias> children;
19+
public TableColumnAlias(String parent, String tableName, String columnName, String aliasName) {
20+
this.parent = parent;
21+
this.tableName = tableName;
22+
this.columnName = columnName;
23+
if (aliasName != null) {
24+
this.aliasName = aliasName
25+
.replaceAll("`", "")
26+
.replaceAll("\"", "")
27+
.replaceAll("'", "")
28+
.trim();
29+
} else {
30+
this.aliasName = null;
31+
}
32+
}
1233

13-
public String getKey(){
14-
return aliasName+"."+columnName;
34+
/**
35+
* 是否是表
36+
*
37+
* @param tableAlias 表别名
38+
* @return 是否是表
39+
*/
40+
public boolean isTable(Map<String, String> tableAlias) {
41+
return tableAlias.containsKey(tableName);
1542
}
1643

17-
public TableColumnAlias(String aliasName, String columnName) {
18-
this.aliasName = aliasName;
19-
this.columnName = columnName;
20-
this.children = new HashMap<>();
44+
45+
/**
46+
* 获取父级key
47+
*
48+
* @return key
49+
*/
50+
public String getParentKey() {
51+
return parent + "." + aliasName;
2152
}
2253

23-
public TableColumnAlias add(String aliasName,String columnName){
24-
TableColumnAlias tableColumnAlias = new TableColumnAlias(aliasName,columnName);
25-
children.put(tableColumnAlias.getKey(),tableColumnAlias);
26-
return tableColumnAlias;
54+
/**
55+
* 获取表别名key
56+
*
57+
* @return key
58+
*/
59+
public String getTableAliasKey() {
60+
return tableName + "." + aliasName;
2761
}
2862
}
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,92 @@
11
package com.codingapi.springboot.authorization.enhancer;
22

3+
import lombok.Getter;
4+
5+
import java.util.ArrayList;
36
import java.util.HashMap;
7+
import java.util.List;
48
import java.util.Map;
59

10+
/**
11+
* 表、字段别名上下文
12+
*/
613
public class TableColumnAliasContext {
714

8-
private final Map<String,TableColumnAlias> tableColumnAliasMap;
15+
private final List<TableColumnAlias> columnAliases;
16+
@Getter
17+
private final Map<String, String> tableAlias;
18+
19+
private final Map<String, String> columnAliasMap;
20+
21+
protected TableColumnAliasContext() {
22+
this.columnAliases = new ArrayList<>();
23+
this.tableAlias = new HashMap<>();
24+
this.columnAliasMap = new HashMap<>();
25+
}
26+
27+
/**
28+
* 添加表别名
29+
* @param tableAlias 表别名
30+
* @param tableName 表名
31+
*/
32+
protected void addTable(String tableAlias, String tableName) {
33+
this.tableAlias.put(tableAlias, tableName);
34+
}
935

10-
public TableColumnAliasContext() {
11-
this.tableColumnAliasMap = new HashMap<>();
36+
/**
37+
* 添加字段别名
38+
* @param parent 父级(上级别名)
39+
* @param tableName 表名
40+
* @param columnName 字段名
41+
* @param aliasName 别名
42+
*/
43+
protected void addColumn(String parent, String tableName, String columnName, String aliasName) {
44+
TableColumnAlias tableColumnAlias = new TableColumnAlias(parent, tableName, columnName, aliasName);
45+
columnAliases.add(tableColumnAlias);
1246
}
1347

14-
public TableColumnAlias add(String aliasName,String columnName){
15-
TableColumnAlias tableColumnAlias = new TableColumnAlias(aliasName,columnName);
16-
tableColumnAliasMap.put(tableColumnAlias.getKey(),tableColumnAlias);
17-
return tableColumnAlias;
48+
/**
49+
* 列别名转换为map
50+
*/
51+
protected void columnKeyToMap() {
52+
for (TableColumnAlias tableColumnAlias : columnAliases) {
53+
if (tableColumnAlias.isTable(tableAlias)) {
54+
String parentKey = tableColumnAlias.getParentKey();
55+
String tableAliasName = tableColumnAlias.getTableName();
56+
String tableName = this.getTableName(tableAliasName);
57+
String columnValue = tableName + "." + tableColumnAlias.getColumnName();
58+
columnAliasMap.put(parentKey, columnValue);
59+
columnAliasMap.put(tableColumnAlias.getTableAliasKey(), columnValue);
60+
}
61+
}
62+
}
63+
64+
/**
65+
* 获取表名(真实表名)
66+
* @param tableName 表名或表别名
67+
* @return 真实表名
68+
*/
69+
public String getTableName(String tableName) {
70+
String value = tableAlias.get(tableName);
71+
if (value != null) {
72+
return value;
73+
}
74+
return tableName;
1875
}
1976

2077

21-
public void print(){
22-
for(String key:tableColumnAliasMap.keySet()){
23-
TableColumnAlias tableColumnAlias = tableColumnAliasMap.get(key);
24-
System.out.println(tableColumnAlias.getKey());
78+
/**
79+
* 获取字段名(真实字段名)
80+
* @param tableName 表名或表别名
81+
* @param columnName 字段名
82+
* @return 真实字段名
83+
*/
84+
public String getColumnName(String tableName, String columnName) {
85+
String key = tableName + "." + columnName;
86+
String value = columnAliasMap.get(key);
87+
if (value != null) {
88+
return value.split("\\.")[1];
2589
}
90+
return columnName;
2691
}
2792
}

0 commit comments

Comments
 (0)