我正在使用 Spring Data Rest 编写某种“hello-world”REST 服务。
我有一个简单的@Entity类:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
@Temporal(DATE)
private Date birthDate;
private String email;
@Column(length = 60)
@JsonDeserialize(using = BCryptPasswordDeserializer.class)
private String password;
// getters and setters
}
如您所见,密码字段上方有一个 @JsonDeserialize,因此来自客户端的任何密码在进入数据库之前都会使用 BCryptPasswordEncoder 进行编码。顺便说一句,我正在使用 H2 内存数据库。
BCryptPasswordDeserializer 的实现:
public class BCryptPasswordDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPassword = encoder.encode(node.asText());
return encodedPassword;
}
}
我的资源中还有 data.sql:
insert into user (id, first_name, last_name, birth_date, email, password)
values (1, 'Ivan', 'Ivanov', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="086126617e6966677e487c6d7b7c267c6d7b7c" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(2, 'Petr', 'Petrov', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aede80decbdadcc1d8eedacbddda80dacbddda" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(3, 'John', 'Cena', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="412b6f22242f2001352432356f35243235" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(4, 'Michael', 'Moore', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e68bc88b89899483a692839592c892839592" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(5, 'Trevor', 'Fassbender', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f185df9790828293949f959483b185948285df85948285" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
这就是我的“问题”:我需要一些东西,在插入表之前也能对该文件中的密码进行编码。有什么办法可以做到这一点吗?或者也许Spring中有一些不同的方式来填充数据库,允许在插入数据之前使用加密逻辑?
最佳答案
我将创建 Spring 组件,该组件使用存储库在启动后插入数据。
类似这样的事情:
@Component
class UserCreator {
@Autowired
private UserRepository userRepository;
@PostConstruct
public void init() {
userRepository.save(new User('Ivan', 'Ivanov', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1f763176697e7170695f6b7a6c6b316b7a6c6b" rel="noreferrer noopener nofollow">[email protected]</a>', '123567'));
// etc
}
}
要控制是否使用UserCreator
(您可能不想在生产环境中执行此操作),您可以添加一个@Profile
注释类。或者,仅当 User
数据库表为空时才插入数据...(或您想要的任何条件)。
关于spring-boot - Spring Boot/Spring 数据。如何使用包含未编码数据的 data.sql 用编码数据填充数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49322587/