Ruby on rails RubyonRails身份验证函数中发生了什么

Ruby on rails RubyonRails身份验证函数中发生了什么,ruby-on-rails,authentication,Ruby On Rails,Authentication,我一直在深入研究rails的身份验证功能 实际上,默示似乎非常简单,但肯定会有更多的魔法发生。我希望有人能解释以下结果 BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q') == 'test1234567' => true BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcP

我一直在深入研究rails的身份验证功能

实际上,默示似乎非常简单,但肯定会有更多的魔法发生。我希望有人能解释以下结果

BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q') == 'test1234567'
=> true

BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q')
=> "$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q"

"$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q" == 'test1234567'
=> false
第一条语句中的密码是正确的。看起来它正在对哈希密码的BCrypt::Password.new进行评估,并将其与给定字符串进行比较

为了测试这一点,我在第二条语句中计算了BCrypt::Passowrd.new,然后在第三条语句中将其与正确的密码进行了比较。这返回false。。。我试图避开正斜杠,但结果相同

有人能解释一下这里发生了什么事吗


下面是实现身份验证的链接

让我们把它一句一句地分解

password.inspect
=> "\"$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q\""
第一条语句是ok,它初始化
BCrypt::Password
对象并将其与字符串进行比较
BCrypt::Password
实现,它根据临时
BCrypt::Password
对象检查对象(在本例中为字符串)

在第二条语句中,与第一条语句一样,您正在初始化
BCrypt::Password
对象,但没有将其保存到变量中,并且该对象未被引用和未使用。语句的输出只是返回对象上
.inspect
结果的IRB

最后,第三条语句看起来像是在比较两个不相等的字符串,而不是任何
BCrypt::Password
对象

要修复您的第二个和第三个语句,使其协同工作,您需要执行以下操作:

# Updated second statement
password = BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q')
=> "$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q"

# Updated third statement
password == 'test1234567'
=> true
实际上,您可以自己调用
.inspect
on
password
,您将看到与IRB为第二条语句返回的结果类似的结果

password.inspect
=> "\"$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q\""

嘿,马修,谢谢你的回复。我故意在第二条语句中打印出BCrypt::Password的结果,然后在第三条语句中复制/粘贴它。我不知道打印出来的是密码对象的
.inspect
功能。另外,您提出的另一个要点是BCrypt::Password实现了比较运算符。我不清楚为什么会这样,但这是有道理的。再次感谢您的回复