我有一个spring data rest自定义用户存储库,其中密码需要使用BCCrypt加密 . 从UI我发送普通密码,我想知道在hibernate在DB中创建用户之前将普通密码转换为BCCrypt哈希的位置 . 我应该在保存拦截器和散列密码之前使用吗?或者有什么方法可以告诉spring使用密码编码器?
您需要在 Registration-Service 中执行此操作,如下所示:
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 这个编码器会自动为您生成一个盐 .
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
在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())); } } }
2 回答
您需要在
Registration-Service
中执行此操作,如下所示:我推荐的密码编码器是
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
这个编码器会自动为您生成一个盐 .在Spring Data Rest中拦截插入的方法是使用事件处理程序 .
NOTE: 此代码赢得't work with PATCH operations that don' t包含密码字段 .