Ruby on Rails Authenticate函数中发生了什么

时间:2018-10-10 22:21:20

标签: ruby-on-rails authentication

我一直在更深入地研究Rails身份验证功能

实际上的障碍似乎很简单,但必须有更多的魔术发生。我希望有人可以解释以下结果...

FineUploader

第一条语句中的密码正确。看起来它正在评估哈希密码上的BCrypt :: Password.new并将其与给定的字符串进行比较。

要对此进行测试,我在第二条语句中评估了BCrypt :: Passowrd.new,然后在第三条语句中将其与正确的密码进行了比较。这返回false ...我尝试转义正斜杠,但结果相同。

请问谁能解释一下这里发生了什么事?

这里是实现身份验证的链接。 https://apidock.com/rails/ActiveModel/SecurePassword/InstanceMethodsOnActivation/authenticate

1 个答案:

答案 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\""