为了安全地存储我的用户密码,我试图在我的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
为什么会发生这种情况,即使传递给方法的值有效且正确?
答案 0 :(得分:0)
创建一个名为secret的密钥,删除密码和password_hash。
将您的代码更改为:
def password=(password)
self.secret = BCrypt::Password.create(password)
end
def password
return BCrypt::Password.new(secret) if self.secret
nil
end