数据脱敏

  数据脱敏主要是为了是=使一些展示出来的私密的数据模糊化,起到保密的作用。 数据脱敏针对多个数据集和数据源时,接口可有多个实现,只需在配置文件中把不同的实现注入到脱敏列表中即可。

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>

results matching ""

    No results matching ""