Ruby BCrypt密码比较返回不正确的评估值



为了安全地存储用户的密码,我试图在Sinatra/Ruby应用程序中使用BCrypt。

以下代码属于我的用户模型。

require 'mongo_mapper'
require 'bcrypt'
# User model
class User
    include MongoMapper::Document
    include BCrypt
    key     :email,         String,         length: 6..50,      unique: true
    key     :password,      String
    key     :password_hash, String
    def password
        @password ||= Password.new(password_hash)
    end
    def password=(new_password)
        @password = Password.create(new_password)
        self.password_hash = @password
    end
    def self.authenticate(requested_email, requested_password)
        u = self.find_by_email(requested_email)
        u if u && u.password_hash == requested_password
    end
end
# Test user account
if User.count == 0
    user = User.new(email: "bar@foo.com")
    user.password = "admin"
    user.save
end

当我像这样调用authenticate方法:User.authenticate("bar@foo.com", "admin")时,代码返回false。我确信该用户存在。

编辑:u.password == requested_password也返回错误

为什么会发生这种情况,即使传递给方法的值是有效和正确的?

创建一个名为secret的密钥,删除password和password_hash。

将您的代码更改为:

def password=(password)
  self.secret = BCrypt::Password.create(password)
end
def password
  return BCrypt::Password.new(secret) if self.secret
  nil
end

最新更新