spring boot jpa 数据库字段加密存储
在 Spring Boot JPA 中,可以通过自定义 AttributeConverter 类来实现数据库字段的加密存储。
AttributeConverter 是 JPA 2.1 中引入的一个接口,用于在实体属性和数据库列之间进行转换。我们可以继承 AttributeConverter 接口并实现其两个方法:convertToDatabaseColumn 和 convertToEntityAttribute。convertToDatabaseColumn 方法将实体属性转换为数据库列,convertToEntityAttribute 方法将数据库列转换为实体属性。这样,在保存实体时,实体属性将被转换为加密的字符串,并在从数据库检索实体时被转换回原始值。
以下是一个使用 AttributeConverter 将数据库字段加密存储的示例:
java
Copy code
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Converter
public class PasswordEncryptor implements AttributeConverter<String, String> {
private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
@Override
public String convertToDatabaseColumn(String attribute) {
return encoder.encode(attribute);
}
@Override
public String convertToEntityAttribute(String dbData) {
return dbData;
}
}
在这个示例中,我们使用 Spring Security 提供的 BCryptPasswordEncoder 来加密密码。在 convertToDatabaseColumn 方法中,我们将密码字符串加密并返回加密后的字符串。在 convertToEntityAttribute 方法中,我们直接返回数据库中的原始字符串,因为我们只需在保存时加密字符串。
为了在实体中使用这个自定义转换器,我们需要在实体类的字段上使用 @Convert 注解,并将自定义转换器类作为参数传递。例如:
java
Copy code
@Entity
public class User {
@Id
private Long id;
private String username;
@Convert(converter = PasswordEncryptor.class)
private String password;
// 其他字段和方法
}
在这个示例中,我们使用 @Convert 注解将 password 字段映射到 PasswordEncryptor 转换器,从而将密码加密存储在数据库中。