Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring数据Rest用户存储库BCCrypt密码_Spring_Spring Boot_Spring Security_Spring Data Jpa_Spring Data Rest - Fatal编程技术网

Spring数据Rest用户存储库BCCrypt密码

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

我有一个SpringDataREST自定义用户存储库,其中的密码需要使用BCCrypt加密。在我发送普通密码的UI中,我想知道在hibernate在DB中创建用户之前,在哪里将普通密码转换为BCCrypt哈希。我应该在保存拦截器和散列密码之前使用吗?或者我有没有办法告诉spring使用密码编码器

您需要在
注册服务中执行此操作,如下所示:

    @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时加密传入密码,请参阅