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 转换器,从而将密码加密存储在数据库中。

 

posted @ 2023-03-16 10:22  三瑞  阅读(718)  评论(0编辑  收藏  举报