当我用BCrypt的用户名和密码登录时检查没问题,一切都很好。
但是当我完成恢复密码的过程并尝试使用新密码登录时,BCrypt永远不会返回true。
我的代码如下:
before_save :encrypt_password
before_update :encrypt_password
def authenticate
player = Player.find_by(mail: self.mail)
unless player.nil?
current_password = BCrypt::Password.new(player.password)
if current_password == self.password
player
else
nil
end
end
end
private
def encrypt_password
unless self.password.nil?
self.password = BCrypt::Password.create(self.password)
end
我正在使用rails 4
答案 0 :(得分:3)
您不需要before_update
回调。
创建新记录(本例中为用户)时,仅触发before_save
。所以你得到了正确的行为。
但是,在更新记录时,before_update
和before_save
都会被触发,这意味着您的password
列会加密两次。这就是你出乎意料的行为的原因。
检查this page以获取有关回调的更多信息。
更重要的是,我认为让password
成为数据库中真正的专栏是个坏主意。您只需要在数据库中使用名为encrypted_password
的列,并使password
成为虚拟属性。
所以你可以这样编写encrypt_password
方法:
def encrypt_password
unless self.password.nil?
self.encrypt_password = BCrypt::Password.create(self.password)
end
这让你没有机会像你刚才那样犯错误。