背景
遇到一个需求,对数据库中的某些字段进行加密存储,但是在各个服务流转中,需要是解密状态的。框架使用的是JPA。
Spring 提供了 AttributeConverter<T,R> 用来将实体属性与数据库字段之间的逻辑转换。换日期格式转换这种。但是我们这边需要改变类型,只需要改变类型的值。
但是使用原生SQL的时候用加密字段进行查询的化,是不会使用类型转换器的。所以我这里增加了一个注解,来拦截标有该注解的参数,然后将参数的值进行修改,然后再进行查询。这里实现的化使用的是 AOP
场景
- 使用实体类进行查询,插入,更新,删除(
HQL
)- 使用加密字段进行查询的(使用
类型转换器
实现) - 返回为实体类 (使用
类型转换器
实现)
- 使用加密字段进行查询的(使用
- 使用
原生sql
进行查询,插入,更新,删除- 返回出来的是 map 结构(需要单独处理)
- 返回为实体类 (使用
类型转换器
实现) - 使用加密字段进行查询的(
AOP + 注解实现
)
实现
类型转换器
实现
AttributeConverter
@Slf4j
public class CryptoConvert implements AttributeConverter<String,String> {
/**
* 存入数据库前进行的转化操作
* @param attribute
* @return
*/
@Override
public String convertToDatabaseColumn(String attribute) {
String encode = CryptoUtil.encode(attribute);
log.info("oldValue:{},newValue:{}",attribute,encode);
return encode;
}
/**
* 取出数据库后进行的转化操作
* @param dbData
* @return
*/
@Override
public String convertToEntityAttribute(String dbData) {
String decode = CryptoUtil.decode(dbData);
log.info("oldValue:{},newValue:{}",dbData,decode);
return decode;
}
}