# 数据保护(加密与脱敏)
数据保护是对数据进行
加密存储
与脱敏展示
,以防范安全风险,达到安全等保要求。
# 配置使用 - 后端
- 注入保护字段处理Handler(
ProtectFieldHandler
的实现)- Diboot 预置了默认的保护字段处理Handler实现
DefaultProtectFieldHandler
,可供继承
- Diboot 预置了默认的保护字段处理Handler实现
示例:
/**
* 自定义保护字段处理器
*/
@Component
public class CustomProtectFieldHandler extends DefaultProtectFieldHandler {
// 父类中预置的加密脱敏实现不满足需求时,可override自定义
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 需要加密脱敏的字段加
@ProtectField
注解
@ProtectField
private String idCard;
1
2
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
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
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