1

当我通过 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

我正在使用导轨 4

4

1 回答 1

3

你不需要before_update回调。

创建新记录(本例中为用户)时,仅before_save触发。所以你得到了正确的行为。

但是在更新记录时,before_update和都会before_save被触发,这意味着您的password列被加密了两次。这就是为什么你会得到意想不到的行为。

查看此页面以获取有关回调的更多信息。


更重要的是,我认为password在数据库中创建一个真正的列是一个坏主意。您只需要在数据库中调用一个列encrypted_password并创建password一个虚拟属性。

所以你可以写encrypt_password这样的方法:

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

这使您没有机会像刚刚犯的那样犯错误。

于 2013-07-21T15:44:21.693 回答