2727import java .util .HashMap ;
2828import java .util .List ;
2929import java .util .Map ;
30+ import java .util .regex .Pattern ;
31+ import java .util .regex .PatternSyntaxException ;
3032
3133@ Slf4j
3234public 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 {
0 commit comments