我一直在更深入地研究Rails身份验证功能
实际上的障碍似乎很简单,但必须有更多的魔术发生。我希望有人可以解释以下结果...
FineUploader
第一条语句中的密码正确。看起来它正在评估哈希密码上的BCrypt :: Password.new并将其与给定的字符串进行比较。
要对此进行测试,我在第二条语句中评估了BCrypt :: Passowrd.new,然后在第三条语句中将其与正确的密码进行了比较。这返回false ...我尝试转义正斜杠,但结果相同。
请问谁能解释一下这里发生了什么事?
这里是实现身份验证的链接。 https://apidock.com/rails/ActiveModel/SecurePassword/InstanceMethodsOnActivation/authenticate
答案 0 :(得分:1)
让我们逐条说明。
您的第一条语句没问题,它会初始化BCrypt::Password
对象并将其与字符串进行比较。 BCrypt::Password
实现了comparison operator,它根据临时BCrypt::Password
对象检查一个对象(在这种情况下为字符串)。
在第二条语句中,与第一条语句一样,您正在初始化BCrypt::Password
对象,但没有将其保存到变量中,并且该对象成为未引用和未使用的对象。语句的输出只是IRB返回对象上.inspect
的结果。
最后,第三条语句看起来像是在比较两个不相等的字符串,而不是任何BCrypt::Password
对象。
要使第二条和第三条语句一起使用,您需要执行以下操作:
# Updated second statement
password = BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q')
=> "$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q"
# Updated third statement
password == 'test1234567'
=> true
您实际上可以自己呼叫.inspect
上的password
,您将看到与IRB针对第二条语句返回的结果类似的结果。
password.inspect
=> "\"$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q\""