# 数据保护

数据保护是对数据进行 加密存储脱敏展示

防范安全风险,达到安全等保要求。

# 后端

  1. 配置
# 开启数据加密解密
diboot.core.enable-data-protect=true
1
2
  1. 需要保护的字段加@ProtectField注解
@ProtectField(encryptor = DefaultEncryptStrategy.class, mask = DefaultMaskStrategy.class)
private String idCard;
1
2

注:加密脱敏字段的长度设置应预留充足,确保加密后的字符串不超长。

  • 注解参数说明:

    • encryptor() : 加密策略,默认为 DoNothingEncryptStrategy.class,不做任何处理;可替换为自定义的IEncryptStrategy实现类。

      • 提供了默认加密策略 DefaultEncryptStrategy ,需自行指定。
    • mask() : 脱敏策略,默认为 DoNothingMaskStrategy.class,不做任何处理;可按需替换为自定义的IMaskStrategy实现类。

      • 提供了默认脱敏策略 DefaultMaskStrategy,需自行指定。
  • 注意事项:

    • 必须为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