Spring数据Rest用户存储库BCCrypt密码
我有一个SpringDataREST自定义用户存储库,其中的密码需要使用BCCrypt加密。在我发送普通密码的UI中,我想知道在hibernate在DB中创建用户之前,在哪里将普通密码转换为BCCrypt哈希。我应该在保存拦截器和散列密码之前使用吗?或者我有没有办法告诉spring使用密码编码器 您需要在Spring数据Rest用户存储库BCCrypt密码,spring,spring-boot,spring-security,spring-data-jpa,spring-data-rest,Spring,Spring Boot,Spring Security,Spring Data Jpa,Spring Data Rest,我有一个SpringDataREST自定义用户存储库,其中的密码需要使用BCCrypt加密。在我发送普通密码的UI中,我想知道在hibernate在DB中创建用户之前,在哪里将普通密码转换为BCCrypt哈希。我应该在保存拦截器和散列密码之前使用吗?或者我有没有办法告诉spring使用密码编码器 您需要在注册服务中执行此操作,如下所示: @Autowired private BCryptPasswordEncoder passwordEncoder; ... p
注册服务中执行此操作,如下所示:
@Autowired
private BCryptPasswordEncoder passwordEncoder;
...
public void registerUser(final User user)
{
final String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
userRepo.save(user);
}
我向您介绍的密码编码器是org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
此编码器自动为您生成salt。在Spring数据Rest中拦截插入的方法是使用事件处理程序
注意:此代码不适用于不包含密码字段的修补程序操作
@Component
@RepositoryEventHandler(User.class)
public class UserEventHandler {
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Autowired
private UserRepository userRepository;
@HandleBeforeCreate
public void handleUserCreate(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
}
@HandleBeforeSave
public void handleUserUpdate(User user) {
if (user.getPassword() == null || user.getPassword().equals("")) {
//keeps the last password
User storedUser = userRepository.getOne(user.getId());
user.setPassword(storedUser.getPassword());
}
else {
//password change request
user.setPassword(passwordEncoder.encode(user.getPassword()));
}
}
}
如果您使用SpringDataREST,您不会访问任何服务层吗?当使用隐式Spring Data Rest控制器时,您如何能够在存储库之前插入此服务?@ManuZi您能够解决此问题吗?我知道我可以实现一个服务层,对持久性工作进行编码并将其委托给存储库,但我正在寻找一个更优雅、更轻量级的解决方案,它只使用隐式JPA存储库。我们可以通过某种方式配置JPA来做到这一点吗?我认为没有其他“优雅”的方法来解决这个问题。当用户存在时,密码更新是什么?@DavidRiccitelli那么你应该实现一个类似的方法,注释为“@HandleBeforeSave”HandleBeforeSave只能通过更新(补丁和放置)而不是插入(POST)来调用,因此,您可以执行不同的实现。我用该方法的一个实现更新了我的回复。这是真的。我结束了使用always PUT,因为Spring数据Rest补丁不是非常RESTful的标准,而且我还有其他问题。顺便说一句,您可以在修补程序操作中始终发送空密码(密码更改请求除外),因此不会从数据库中填充密码。很抱歉,但我认为这不能称为解决方案。您基本上禁止任何其他人使用您的API。问题不是Spring数据REST,而是您提出的解决方案。应在密码字段上使用自定义JsonDeserializer,并在反序列化JSON时加密传入密码,请参阅