首页 > 解决方案 > 由于 Bcrypt 加密,在单元测试期间更新 CRUD 出现问题

问题描述

我在将实体保存到数据库时对我的用户密码进行哈希处理。这样做时,我无法更新用户名,而无需再次散列密码。

我为它写了测试,但失败了。

@Test
@DisplayName("Update")
public void testForUpdate() {
    final User user = new User("UserForUpdate", "UpdatedUser123");
    this.userService.save(user);
    User found = this.userService.findOneByUsernameAndPassword(user.getUsername(), user.getPassword());
    assertTrue(found.getId() != null, "Found real user");
    this.userService.save(found);
    final User asserted = this.userService.findOneByUsernameAndPassword(found.getUsername(), user.getPassword());
    assertTrue(asserted != null, "Updated user found");
    assertTrue(user.getId() == asserted.getId(), "User ID is persisted");
}

UserService 的保存方法如下所示:

@Override
public User save(User newUser) {
    newUser.setPassword(passwordEncoder.encode(newUser.getPassword()));
    return repository.save(newUser);
}

像这样保存它我做错了吗?

我应该如何继续正确实施 CRUD 更新?

感谢您的任何指点

标签: junitspring-securityspring-data-jpa

解决方案


存储用户时不要修改密码。而是在修改密码时对密码进行编码。

public class UserSevice {

    ...

    public changePassword(User user, String plainPassword) {
       user.setPassword(passwordEncoder.encode(plainPassword));
    }

}

推荐阅读