首页 文章

Spring Data Rest用户存储库BCCrypt密码

提问于
浏览
5

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

2 回答

  • 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);
        }
    

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

  • 8

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

    NOTE: 此代码赢得't work with PATCH operations that don' t包含密码字段 .

    @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()));
        }
      }
    }
    

相关问题