使用before_create和before_update时,密码被哈希两次

时间:2015-04-09 14:33:39

标签: ruby-on-rails

在我的用户模型中,我有一个hash_password方法,可以在创建新用户之前加密用户的密码。我还在更新用户密码时使用此方法。这导致密码被哈希两次。

user.rb:

before_create :hash_password
before_update :hash_password

def hash_password
    self.password = Digest::SHA1.hexdigest(self.password)
    self.password_confirmation = Digest::SHA1.hexdigest(self.password_confirmation)
end

如何防止这种情况发生?提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我认为问题在于,当您输入新密码时,您会在保存时进行哈希处理,但是当密码未更改时,您也会在保存时进行哈希处理(以及双重哈希)

您可能想要尝试此操作,在before_save

上调用
def hash_password
  return if persisted? && password == User.find(id).password
  self.password = Digest::SHA1.hexdigest(password)
  self.password_confirmation = Digest::SHA1.hexdigest(password_confirmation)
end

这意味着散列只会发生在新记录或密码更改的持久记录上。

答案 1 :(得分:0)

回调before_createbefore_update可以与before_save合并/替换。也就是说,如果你想要那个功能。如果您只想在创建函数时调用该函数,那么当然要取出before_update回调。

更新

这可能是您如何创建User的一些怪癖。如果您拨打User.create,它似乎会触发两次,但如果您使用User.build然后使用save,它似乎可以正常工作,至少根据this article

答案 2 :(得分:0)

替换

 before_create :hash_password
 before_update :hash_password

使用before_save :hash_password