【问题标题】:Spring Boot/Spring Data. How to fill DB with encoded data using data.sql containing not encoded dataSpring Boot/Spring 数据。如何使用包含未编码数据的 data.sql 用编码数据填充数据库
【发布时间】:2018-03-16 14:02:04
【问题描述】:

我正在使用 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', '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');

还有我的“问题”:我需要一些东西,在插入表格之前,也可以从这个文件中编码密码。有没有办法做到这一点?或者也许在 Spring 中有一些不同的方式来填充数据库,允许在插入数据之前使用加密逻辑?

【问题讨论】:

  • dailycred.com/article/bcrypt-calculator 1234567 -> $2a$04$RZsL0kD/VHs0UU2maqA86OK1H08A18/78aooPcZ1zuLVH0TuWszkG
  • @Cepr0 谢谢,但我不想硬编码那个东西 :)
  • 你已经这样做了。
  • @Cepr0 好吧,假设这只是临时解决方案。也许在 Spring 中有一些不同的方式来填充数据库,允许在插入数据之前使用加密逻辑?

标签: spring-boot h2 spring-data-rest


【解决方案1】:

我将创建 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 数据库表为空时才插入数据...(或您想要的任何条件)。

【讨论】:

  • 谢谢!正是我需要的,除了它必须是 new BCryptPasswordEncoder().encode("123456") 而不是简单的 '123456'
  • 由于某种原因,@Entity 类中还必须有一个空的构造函数。没有它,即使来自客户端的密码也不会编码。
  • 你会如何在生产环境中做到这一点?
猜你喜欢
  • 2016-10-13
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多