我正在写一些" hello-world" Spring Data Rest的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', 'i.ivanov@test.test', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(2, 'Petr', 'Petrov', '1990-01-01', 'p.petrov@test.test', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(3, 'John', 'Cena', '1990-01-01', 'j.cena@test.test', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(4, 'Michael', 'Moore', '1990-01-01', 'm.moore@test.test', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(5, 'Trevor', 'Fassbender', '1990-01-01', 't.fassbender@test.test', '123567');
还有我的问题&#34;:在插入表格之前,我还需要一些能够对此文件中的密码进行编码的内容。有没有办法做到这一点?或者也许在Spring中有一些不同的方式来填充数据库,允许在插入数据之前使用加密逻辑?
答案 0 :(得分:0)
我会创建一个Spring组件,它使用存储库在启动后插入数据。
这样的事情:
@Component
class UserCreator {
@Autowired
private UserRepository userRepository;
@PostConstruct
public void init() {
userRepository.save(new User('Ivan', 'Ivanov', '1990-01-01', 'i.ivanov@test.test', '123567'));
// etc
}
}
要控制是否使用UserCreator
(您可能不希望在生产环境中执行此操作),可以在类中添加@Profile
注释。或者只有在User
数据库表为空时...(或者您想要的任何条件)时才插入数据。