我是Ruby的新来者,如果这个问题已经得到解答,请道歉。我已经阅读了其他问题,仍然无法弄清楚我做错了什么。
我正在创建散列密码,以便存储在这样的数据库中:
new_user.password = BCrypt::Password.create(unhashed_password)
# Write the user to database
new_user.store_user
然后我通过检查输入的用户名从数据库中检索用户,然后检查密码,如下所示:
# Get user from the database
def self.get_user(check_user_name)
db = User.open_db
user = User.new
user_arr = db.execute("SELECT * FROM user_data WHERE user_name = ?", check_user_name).first
db.close
# if the user exists check the password
if user_arr.size != 0
print "Enter your password : "
# Get password from user
user_input_password_attempt = gets.chomp
end
# Parse the db user into a user class if password guess is correct
stored_password = BCrypt::Password.new(user_arr[2])
if user_input_password_attempt == stored_password
@@users_logged_in += 1
user.user_id = user_arr[0]
user.user_name = user_arr[1]
user.password = user_arr[2]
return user
end
:no_user
端
我的问题是var stored_password正在返回一个哈希并且!= user_input_password_attempt 我已经阅读了Ruby-Doc并广泛搜索了这个
答案 0 :(得分:0)
使用==
时,实际上是调用左侧对象上定义的==
方法,将右侧作为参数传递:
a == b
相当于
a.==(b)
根据您调用==
方法的对象,您可能会收到不同的结果。换句话说:
a == b
可能会或可能不会返回与
不同的结果b == a
虽然我个人认为这是无意义的,而且平等操作符应该是transitive
,symetric
和reflexive
,BCrypt人员决定以另一种方式实现它:
def ==(secret)
super(BCrypt::Engine.hash_secret(secret, @salt))
end
(摘自http://bcrypt-ruby.rubyforge.org/classes/BCrypt/Password.html#M000009)
这意味着你必须写:
stored_password = BCrypt::Password.new(user_arr[2])
if stored_password == user_input_password_attempt
...
end
以便在==
实例上调用Password
方法。