Ruby on rails 使用BCrypt更新密码

Ruby on rails 使用BCrypt更新密码,ruby-on-rails,ruby,ruby-on-rails-4,bcrypt,bcrypt-ruby,Ruby On Rails,Ruby,Ruby On Rails 4,Bcrypt,Bcrypt Ruby,当我用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的用户名和密码登录时,检查没有问题,一切都很好

但是,当我经历恢复密码的过程并尝试使用新密码登录时,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,在更新回调之前,您不需要

创建新记录时(在本例中为用户),仅触发保存之前的
。所以你的行为是正确的

但是在更新记录时,会触发更新之前的
和保存之前的
,这意味着您的
密码列会加密两次。这就是为什么你会有意想不到的行为

查看有关回调的更多信息


更重要的是,我认为在数据库中设置
password
一个真正的列是个坏主意。您只需要在数据库中创建一个名为
encrypted\u password
的列,并将
password
设置为虚拟属性

因此,您可以这样编写
encrypt\u password
方法:

def encrypt_password
    unless self.password.nil?
    self.encrypt_password = BCrypt::Password.create(self.password)
end

这让你没有机会犯你刚才犯的错误。

是的,它现在起作用了!!非常感谢你,因为我刚开始在RailsOk!我明白了!再来一次!