Skip to content

Commit 6b6378b

Browse files
committed
fix DataAuthorization
1 parent b3bae31 commit 6b6378b

File tree

25 files changed

+236
-156
lines changed

25 files changed

+236
-156
lines changed

example/example-application/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-example</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>3.3.42</version>
8+
<version>3.3.43</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

example/example-domain/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-example</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>3.3.42</version>
8+
<version>3.3.43</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

example/example-infra-flow/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-example</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>3.3.42</version>
8+
<version>3.3.43</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

example/example-infra-jpa/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-example</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>3.3.42</version>
8+
<version>3.3.43</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

example/example-server/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<artifactId>springboot-example</artifactId>
77
<groupId>com.codingapi.springboot</groupId>
8-
<version>3.3.42</version>
8+
<version>3.3.43</version>
99
</parent>
1010
<modelVersion>4.0.0</modelVersion>
1111

example/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</parent>
1818

1919
<artifactId>springboot-example</artifactId>
20-
<version>3.3.42</version>
20+
<version>3.3.43</version>
2121

2222
<name>springboot-example</name>
2323
<description>springboot-example project for Spring Boot</description>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
<groupId>com.codingapi.springboot</groupId>
1717
<artifactId>springboot-parent</artifactId>
18-
<version>3.3.42</version>
18+
<version>3.3.43</version>
1919

2020
<url>https://github.com/codingapi/springboot-framewrok</url>
2121
<name>springboot-parent</name>

springboot-starter-data-authorization/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>com.codingapi.springboot</groupId>
88
<artifactId>springboot-parent</artifactId>
9-
<version>3.3.42</version>
9+
<version>3.3.43</version>
1010
</parent>
1111

1212
<artifactId>springboot-starter-data-authorization</artifactId>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import com.codingapi.springboot.authorization.handler.ColumnHandler;
66
import com.codingapi.springboot.authorization.handler.RowHandler;
77
import com.codingapi.springboot.authorization.interceptor.SQLInterceptor;
8+
import com.codingapi.springboot.authorization.properties.DataAuthorizationProperty;
89
import com.codingapi.springboot.authorization.register.ConditionHandlerRegister;
910
import com.codingapi.springboot.authorization.register.DataAuthorizationContextRegister;
1011
import com.codingapi.springboot.authorization.register.ResultSetHandlerRegister;
1112
import com.codingapi.springboot.authorization.register.SQLInterceptorRegister;
1213
import org.springframework.beans.factory.annotation.Autowired;
14+
import org.springframework.boot.context.properties.ConfigurationProperties;
1315
import org.springframework.context.annotation.Bean;
1416
import org.springframework.context.annotation.Configuration;
1517

@@ -18,6 +20,12 @@
1820
@Configuration
1921
public class DataAuthorizationConfiguration {
2022

23+
@Bean
24+
@ConfigurationProperties(prefix = "codingapi.data-authorization")
25+
public DataAuthorizationProperty dataAuthorizationProperty(){
26+
return new DataAuthorizationProperty();
27+
}
28+
2129
@Bean
2230
public ConditionHandlerRegister conditionHandlerRegister(@Autowired(required = false) RowHandler rowHandler) {
2331
return new ConditionHandlerRegister(rowHandler);

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,24 @@ public void addDataAuthorizationFilter(DataAuthorizationFilter filter) {
2727
this.filters.add(filter);
2828
}
2929

30-
public void clearDataAuthorizationFilters(){
30+
public void clearDataAuthorizationFilters() {
3131
this.filters.clear();
3232
}
3333

3434
public <T> T columnAuthorization(SQLInterceptState interceptState, String tableName, String columnName, T value) {
35-
if (interceptState != null && interceptState.hasIntercept() && StringUtils.hasText(tableName)) {
35+
if (interceptState != null && interceptState.hasIntercept()) {
36+
String realTableName = interceptState.getTableName(tableName);
3637
for (DataAuthorizationFilter filter : filters) {
37-
if (filter.supportColumnAuthorization(tableName, columnName, value)) {
38-
return filter.columnAuthorization(tableName, columnName, value);
38+
if (filter.supportColumnAuthorization(realTableName, columnName, value)) {
39+
return filter.columnAuthorization(realTableName, columnName, value);
3940
}
4041
}
4142
}
4243
return value;
4344
}
4445

4546
public Condition rowAuthorization(String tableName, String tableAlias) {
46-
if(StringUtils.hasText(tableName) && StringUtils.hasText(tableAlias)) {
47+
if (StringUtils.hasText(tableName) && StringUtils.hasText(tableAlias)) {
4748
for (DataAuthorizationFilter filter : filters) {
4849
if (filter.supportRowAuthorization(tableName, tableAlias)) {
4950
return filter.rowAuthorization(tableName, tableAlias);

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

Lines changed: 0 additions & 120 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.codingapi.springboot.authorization.enhancer;
2+
3+
import com.codingapi.springboot.authorization.handler.Condition;
4+
import com.codingapi.springboot.authorization.handler.RowHandler;
5+
import lombok.Getter;
6+
import net.sf.jsqlparser.expression.Expression;
7+
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
8+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
9+
import net.sf.jsqlparser.schema.Table;
10+
import net.sf.jsqlparser.statement.Statement;
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;
15+
16+
import java.sql.SQLException;
17+
import java.util.HashMap;
18+
import java.util.Map;
19+
20+
/**
21+
* 数据权限 SQL 增强器
22+
*/
23+
public class DataPermissionSQLEnhancer {
24+
25+
private final String sql;
26+
private final RowHandler rowHandler;
27+
28+
@Getter
29+
private final Map<String, String> tableAlias;
30+
31+
// 构造函数
32+
public DataPermissionSQLEnhancer(String sql, RowHandler rowHandler) {
33+
// 如何sql中存在? 则在?后面添加空格
34+
this.sql = sql.replaceAll("\\?", " ? ");
35+
this.rowHandler = rowHandler;
36+
this.tableAlias = new HashMap<>();
37+
}
38+
39+
// 获取增强后的SQL
40+
public String getNewSQL() throws SQLException {
41+
try {
42+
Statement statement = CCJSqlParserUtil.parse(sql);
43+
if (statement instanceof Select) {
44+
Select select = (Select) statement;
45+
PlainSelect plainSelect = select.getPlainSelect();
46+
47+
this.enhanceDataPermissionInSelect(plainSelect);
48+
return statement.toString();
49+
}
50+
} catch (Exception e) {
51+
throw new SQLException(e);
52+
}
53+
return sql;
54+
}
55+
56+
// 增强 SELECT 语句
57+
private void enhanceDataPermissionInSelect(PlainSelect plainSelect) throws Exception {
58+
this.applyDataPermissionToSubquery(plainSelect);
59+
60+
FromItem fromItem = plainSelect.getFromItem();
61+
62+
// 处理主 FROM 项(如果是子查询)
63+
if (fromItem instanceof Select) {
64+
this.applyDataPermissionToSubquery((Select) fromItem);
65+
}
66+
Expression where = plainSelect.getWhere();
67+
68+
// 处理JOIN或关联子查询
69+
if (plainSelect.getJoins() != null) {
70+
for (Join join : plainSelect.getJoins()) {
71+
if (join.getRightItem() instanceof Select) {
72+
this.applyDataPermissionToSubquery((Select) join.getRightItem());
73+
}
74+
if(join.getRightItem() instanceof Table){
75+
injectDataPermissionCondition(plainSelect, (Table) join.getRightItem(), where);
76+
}
77+
}
78+
}
79+
}
80+
81+
// 注入数据权限条件
82+
private void injectDataPermissionCondition(PlainSelect plainSelect, Table table, Expression where) throws Exception {
83+
String tableName = table.getName();
84+
String aliaName = table.getAlias() != null ? table.getAlias().getName() : tableName;
85+
tableAlias.put(aliaName, tableName);
86+
Condition condition = rowHandler.handler(plainSelect.toString(), tableName, aliaName);
87+
if (condition != null) {
88+
// 添加自定义条件
89+
Expression customExpression = CCJSqlParserUtil.parseCondExpression(condition.getCondition());
90+
if (where != null) {
91+
plainSelect.setWhere(new AndExpression(customExpression, where));
92+
} else {
93+
plainSelect.setWhere(customExpression);
94+
}
95+
}
96+
}
97+
98+
// 处理子查询
99+
private void applyDataPermissionToSubquery(Select subSelect) throws Exception {
100+
PlainSelect selectBody = subSelect.getPlainSelect();
101+
if (selectBody != null) {
102+
// 获取 WHERE 子句
103+
Expression where = selectBody.getWhere();
104+
FromItem fromItem = selectBody.getFromItem();
105+
if (fromItem instanceof Table) {
106+
injectDataPermissionCondition(selectBody, (Table) fromItem, where);
107+
}
108+
}
109+
}
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.codingapi.springboot.authorization.interceptor;
2+
3+
import lombok.Getter;
4+
5+
import java.util.Map;
6+
7+
@Getter
8+
public class DataPermissionSQL {
9+
10+
private final String sql;
11+
private final String newSql;
12+
private final Map<String,String> tableAlias;
13+
14+
public DataPermissionSQL(String sql, String newSql, Map<String, String> tableAlias) {
15+
this.sql = sql;
16+
this.newSql = newSql;
17+
this.tableAlias = tableAlias;
18+
}
19+
}

0 commit comments

Comments
 (0)