# 数据保护(加密与脱敏)

数据保护是对数据进行 加密存储脱敏展示,以防范安全风险,达到安全等保要求。

# 配置使用 - 后端

  1. 注入保护字段处理Handler(ProtectFieldHandler的实现)
    • Diboot 预置了默认的保护字段处理Handler实现 DefaultProtectFieldHandler,可供继承

示例:

/**
 * 自定义保护字段处理器
 */
@Component
public class CustomProtectFieldHandler extends DefaultProtectFieldHandler {
    // 父类中预置的加密脱敏实现不满足需求时,可override自定义
}

1
2
3
4
5
6
7
8
  1. 需要加密脱敏的字段加@ProtectField注解
@ProtectField
private String idCard;
1
2
  • 注意事项:

    • 被保护字段必须为String类型(加密后的串为String)

    • 可指定自定义的加密、脱敏策略

    • 保护字段不可被关联 (@BindField*),会导致字段未解密或未脱敏。如需关联保护字段可关联该实体,从实体中获取保护字段值。

    • 更新时如前端会回传脱敏后的值,建议在更新前对脱敏值进行移除,避免误更新。

      //示例代码,针对脱敏字段进行过滤
      @Override
      protected String beforeUpdate(Entity entityOrDto) throws Exception {
          String idCard = entityOrDto.getIdCard();
          if (V.notEmpty(idCard) && idCard.contains("*")) {
              entityOrDto.setIdCard(null);
          }
          return null;
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9

# 配置使用 - 前端

该方案可避免脱敏值回传至后端

# 1. antd版本前端(diboot-antd-admin)

form.vue 改造 input 为保护属性输入框

   // ...
   <a-input
     placeholder="请输入"
+    :disabled="notEdit('key')"
     v-decorator="[
       'key',
       {
*        initialValue: !notEdit('key') ? null : model.key,
*        rules: notEdit('key') ? null : [{ required: true, message: 'key不能为空', whitespace: true }]
       }
     ]"
   >
+    <a v-if="!!model[primaryKey]" slot="addonAfter" @click="switchEdit('key')">
+      {{ notEdit('key') ? '编辑' : '取消' }}
+    </a>
   </a-input>
// ...

<script>
import form from '@/components/diboot/mixins/form'
import protect from '@/components/diboot/mixins/protect'
// ...

export default {
    // ...
    // 需保证 protect 在后
    mixins: [form, protect]
    // ...
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 2. element版本前端(diboot-element-admin)

form.vue 中 input 替换

将 el-form-item 标签及其input替换为如下所示组件,
该组件使用方式如同二者合并,将所需属性绑定即可,【需额外增加一个id绑定(必须的)】
// ...
//<el-col :span="24">
    <protectField
                  :id="form[primaryKey]"
                  v-model="form.key"
                  label="属性名"
                  prop="key"
                  placeholder="请输入"
                  :rules="[
                          {required: true, message: 'key不能为空', trigger: 'blur', whitespace: true}
                          ]"
                  >
    </protectField>
//</el-col>
// ...

<script>
    // 引入保护字段组件
    import protectField from '@/components/diboot/components/protectField'
    // ...

    export default {
        // ...
        // 局部注册组件
        components: { protectField },
        // ...
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30