Skip to content

Commit 91172ff

Browse files
authored
Merge pull request #131 from jumpserver/pr@dev@feat_data_mask_label
feat: mask label and column name
2 parents 50b7d61 + 9bf6bb8 commit 91172ff

3 files changed

Lines changed: 59 additions & 31 deletions

File tree

Dockerfile-base

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ RUN set -ex \
2727
&& chmod 755 /usr/local/bin/check \
2828
&& rm -f check-${CHECK_VERSION}-linux-${TARGETARCH}.tar.gz
2929

30-
ARG WISP_VERSION=v0.2.7
30+
ARG WISP_VERSION=v0.2.8
3131
RUN set -ex \
3232
&& wget https://github.com/jumpserver/wisp/releases/download/${WISP_VERSION}/wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz \
3333
&& tar -xf wisp-${WISP_VERSION}-linux-${TARGETARCH}.tar.gz -C /usr/local/bin/ --strip-components=1 \
@@ -43,7 +43,7 @@ RUN --mount=type=cache,target=/usr/local/share/.cache/yarn,sharing=locked,id=che
4343
npm install
4444

4545
# Install Maven dependencies
46-
ARG MAVEN_VERSION=3.9.10
46+
ARG MAVEN_VERSION=3.9.11
4747
ARG USER_HOME_DIR="/root"
4848
ARG BASE_URL=https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries
4949
ARG MAVEN_MIRROR=https://repo.maven.apache.org/maven2

backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/base/BaseSQLActuator.java

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import java.util.HashMap;
2828
import java.util.List;
2929
import java.util.Map;
30+
import java.util.regex.Pattern;
31+
import java.util.regex.PatternSyntaxException;
3032

3133
@Slf4j
3234
public abstract class BaseSQLActuator implements SQLActuator {
@@ -153,6 +155,8 @@ private void executeStatement(SQLExecutePlan plan, Statement statement, SQLQuery
153155
var fieldName = StringUtils.isNotEmpty(resultSet.getMetaData().getColumnLabel(i)) ?
154156
resultSet.getMetaData().getColumnLabel(i) : resultSet.getMetaData().getColumnName(i);
155157
field.setName(fieldName);
158+
field.setColumnName(resultSet.getMetaData().getColumnName(i));
159+
field.setLabel(resultSet.getMetaData().getColumnLabel(i));
156160
result.getFields().add(field);
157161
}
158162

@@ -184,34 +188,7 @@ private void executeStatement(SQLExecutePlan plan, Statement statement, SQLQuery
184188
result.setFetchFinishedTime(new Time(System.currentTimeMillis()));
185189

186190
// 数据脱敏
187-
188-
var rules = SessionManager.getCurrentSession().getDataMaskingRules();
189-
var maskIndexes = new ArrayList<>();
190-
var maskRules = new HashMap<Integer, Common.DataMaskingRule>();
191-
for (var i = 0; i < result.getFields().size(); i++) {
192-
for (Common.DataMaskingRule rule : rules) {
193-
if (result.getFields().get(i).getName().equalsIgnoreCase(rule.getFieldsPattern())) {
194-
maskIndexes.add(i);
195-
maskRules.put(i, rule);
196-
}
197-
}
198-
}
199-
200-
for (var i = 0; i < result.getData().size(); i++) {
201-
for (var j = 0; j < result.getData().get(i).size(); j++) {
202-
if (maskIndexes.contains(j)) {
203-
var rule = maskRules.get(j);
204-
var val = result.getData().get(i).get(j);
205-
if (val instanceof String) {
206-
var rep = this.replaceColumnVal(rule, (String) val);
207-
result.getData().get(i).set(j, rep);
208-
} else {
209-
result.getData().get(i).set(j, rule.getMaskPattern());
210-
}
211-
}
212-
}
213-
}
214-
191+
this.handleDataMasking(result);
215192

216193
var total = this.count(plan);
217194
if (total < 0) {
@@ -230,9 +207,58 @@ private void executeStatement(SQLExecutePlan plan, Statement statement, SQLQuery
230207
}
231208
}
232209

210+
private void handleDataMasking(SQLQueryResult result) {
211+
var rules = SessionManager.getCurrentSession().getDataMaskingRules();
212+
var maskIndexes = new ArrayList<>();
213+
var maskRules = new HashMap<Integer, Common.DataMaskingRule>();
214+
for (var i = 0; i < result.getFields().size(); i++) {
215+
for (Common.DataMaskingRule rule : rules) {
216+
if (matchFiled(result.getFields().get(i), rule.getFieldsPattern())) {
217+
maskIndexes.add(i);
218+
maskRules.put(i, rule);
219+
}
220+
}
221+
}
222+
223+
for (var i = 0; i < result.getData().size(); i++) {
224+
for (var j = 0; j < result.getData().get(i).size(); j++) {
225+
if (maskIndexes.contains(j)) {
226+
var rule = maskRules.get(j);
227+
var val = result.getData().get(i).get(j);
228+
if (val instanceof String) {
229+
var rep = this.replaceColumnVal(rule, (String) val);
230+
result.getData().get(i).set(j, rep);
231+
} else {
232+
result.getData().get(i).set(j, rule.getMaskPattern());
233+
}
234+
}
235+
}
236+
}
237+
}
238+
239+
private boolean matchFiled(Field field, String pattern) {
240+
var names = List.of(field.getColumnName(), field.getLabel());
241+
var ps = pattern.split(",");
242+
243+
for (String name : names) {
244+
for (String p : ps) {
245+
246+
try {
247+
int flags = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE;
248+
var pa = Pattern.compile(p, flags);
249+
if (pa.matcher(name).find()) {
250+
return true;
251+
}
252+
} catch (PatternSyntaxException e) {
253+
return false;
254+
}
255+
}
256+
}
257+
return false;
258+
}
233259

234260

235-
public String replaceColumnVal(Common.DataMaskingRule rule, String val) {
261+
private String replaceColumnVal(Common.DataMaskingRule rule, String val) {
236262
if (rule == null) {
237263
return "####";
238264
} else {

backend/framework/src/main/java/org/jumpserver/chen/framework/datasource/entity/resource/Field.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
public class Field implements ResourceNode {
88

99
private String name;
10+
private String label;
11+
private String columnName;
1012
private String schema;
1113
private String table;
1214
private String type;

0 commit comments

Comments
 (0)