0

为了安全地存储我的用户密码,我尝试在我的 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也返回 false

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

4

1 回答 1

0

创建一个名为 secret 的密钥,删除密码和密码哈希。

将您的代码更改为:

def password=(password)
  self.secret = BCrypt::Password.create(password)
end

def password
  return BCrypt::Password.new(secret) if self.secret
  nil
end
于 2015-04-10T20:51:56.210 回答