Spring Data Rest用户存储库BCCrypt密码

Vij*_*vva 5 spring spring-security spring-data-jpa spring-data-rest spring-boot

我有一个spring data rest自定义用户存储库,其中密码需要使用BCCrypt加密.从UI我发送普通密码,我想知道在hibernate在DB中创建用户之前将普通密码转换为BCCrypt哈希的位置.我应该在保存拦截器之前使用并哈希密码吗?或者有什么方法可以告诉spring使用密码编码器?

Jav*_*rez 9

在Spring Data Rest中拦截插入的方法是使用事件处理程序.

注意:此代码不适用于不包含密码字段的PATCH操作.

@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()));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • HandleBeforeSave仅使用更新(PATCH和PUT)而不是使用插入(POST)调用,因此您可以执行不同的实现.我通过该方法的实现更新了我的响应. (2认同)

Man*_* Zi 2

您需要在您的 中执行此操作Registration-Service,如下所示:

    @Autowired 
    private BCryptPasswordEncoder passwordEncoder;
    ...
    public void registerUser(final User user)
    {
        final String encodedPassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(encodedPassword);
        userRepo.save(user);
    }
Run Code Online (Sandbox Code Playgroud)

我给你推荐的密码编码器是org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder这个编码器自动为你生成一个盐。

  • 如果你使用 Spring-Data-Rest 你不会触及任何服务层?使用隐式 Spring-Data-Rest 控制器时,如何在存储库之前插入此服务? (6认同)