数据脱敏
数据脱敏主要是为了是=使一些展示出来的私密的数据模糊化,起到保密的作用。 数据脱敏针对多个数据集和数据源时,接口可有多个实现,只需在配置文件中把不同的实现注入到脱敏列表中即可。
1.1.接口说明
接口名称:com.neusoft.saca.dataviz.chartdata.service.datafilter.DataFilter
所在包:dataviz-chartdata.jar
1.1.1 getTargetType方法
getTargetType方法,当前脱敏实现是属于数据集还是数据源
public int getTargetType();
示例代码如下:
@Override
public int getTargetType() {
return DataFilter.TARGET_DATASET; // 数据集脱敏
// return DataFilter.TARGET_DATASOURCE;// 数据源脱敏
}
1.1.2 matches方法
matches方法,根据ID判断数据源或者数据集是否需要进行脱敏
public boolean matches(String id);
示例代码如下:
/**
* 数据源或者数据集是否需要进行脱敏
*
* @param id
* getTargetType如果返回1则ID为数据源ID,如果getTargetType返回2则ID为数据集ID
* @return
*/
@Override
public boolean matches(String id) {
return this.datasetId.equals(id);// 如果对所有数据集进行脱敏,可直接返回true
}
1.1.3 filter方法
filter方法主要进行数据进行脱敏处理
public DataResult filter(DataResult result, String id, Map<String, EntityFieldReference> mappingInfo);
示例代码如下:
/**
* 数据进行脱敏处理,查询图表数据时会调用此方法
*
* @param result
* 数据以及元数据
* @param id
* getTargetType如果返回1则ID为数据源ID,如果getTargetType返回2则ID为数据集ID
* @param mappingInfo
* 纬度字段段映射数据集字段(数据源字段)信息
*
* @return
*/
@Override
public DataResult filter(DataResult result, String id,
Map<String, EntityFieldReference> mappingInfo) {
// 管理员不需要脱敏
if (SecurityUtil.getCurrentUser().getUserId().equals("管理员ID")) {
return result;
}
// 数据的元数据
FieldsMetadata fieldsMetadata = result.getMetadata();
// 数据
List<DataRecord> recordList = result.getData();
String encryptField = this.fieldName;
// 由于数据集字段名称与图表绑定纬度字段名称相同,所以可以不用mappingInfo进行名称追溯
// ***********************如果是数据源脱敏要进行以下逻辑处理***************************
for (String key : mappingInfo.keySet()) {
EntityFieldReference efr = mappingInfo.get(key);
if (getEfrString(efr).equals(this.fieldName)) {
encryptField = key;
break;
}
}
// ***********************如果是数据源脱敏要进行以上逻辑处理***************************
int index = fieldsMetadata.name2Index(encryptField);
for (DataRecord record : recordList) {
// 获取字段对应的数据
Object value = record.getValue(index);
/**
***************** 根据脱敏规则进行脱敏**************
*
*
*
*
*
***************** 根据脱敏规则进行脱敏**************
**/
// 把脱敏后的数据重新放回
record.setValue(index, value);
}
return result;
}
/**
* catalog.schema.table.field 组成完整字段名
*
* @param efr
* @return
*/
public String getEfrString(EntityFieldReference efr) {
StringBuilder sb = new StringBuilder();
if (StringUtils.isNotEmpty(efr.getCatalogName())) {
sb.append(efr.getCatalogName()).append('.');
}
if (StringUtils.isNotEmpty(efr.getSchemaName())) {
sb.append(efr.getSchemaName()).append('.');
}
sb.append(efr.getEntityName()).append('.').append(efr.getFieldName());
return sb.toString();
}
1.2 配置修改
除了代码的处理,还需要修改applicationContext.xml文件,在文件中加入如下内容:
<bean id="dataFilter1" class="com.neusoft.saca.dataviz.chartdata.service.datafilter.impl.DataFilterImpl"></bean>
<bean id="customFilters" class="com.neusoft.saca.dataviz.chartdata.service.datafilter.CustomDataFilters">
<constructor-arg>
<list>
<ref bean="dataFilter1" />
<!-- 可以添加其他脱敏实现 -->
</list>
</constructor-arg>
</bean>