在过去的两个小时里,我一直试图在设计中调试一个奇怪的问题,而不是让我登录。
这也是我所指的东西:
password
=> 'vinodsobale'
password == 'vinodsobale'
=> true
resource.valid_password?(password)
=> false
resource.valid_password?('vinodsobale')
=> true
附上截图:
注意:我在设计中启用了调试器,因此上面的代码是设计内部代码。
对我来说,它似乎是Devise.secure_compare
中的一个问题。
答案 0 :(得分:2)
此问题是由于2.2.2中的Ruby 2.2.0中已知的字符串损坏错误fixed。
如bug report中所述,当BCrypt从其C扩展调用特定字符串创建API时发生了损坏,通过从Devise::Models::DatabaseAuthenticatable#valid_password?
调用::BCrypt::Engine.hash_secret
来触发Devise v3.3.0方法。针对此错误的特定于Devise的workaround发布于v3.5.0。
解决方案是:
< 2.2.0
,或升级至>= 2.2.2
; >= 3.5.0
。答案 1 :(得分:0)
Devise DatabaseAuthenticatable#valid_password?
正在使用一个名为Encryptor::compare
的方法,它需要2个对象,当前存储的密码和你要比较的新密码,我相信这个方法有一个副作用,修改了中间的第二个参数因此它会修改对象,而不是一旦它被修改两次导致错误的结果,所以如果你传递了一个重复的密码对象,它可能会起作用。
你可以尝试使用valid_password? password.dup
答案 2 :(得分:0)
原始源和控制台之间的编码可能存在问题。如果您运行password.codepoints
,您应该能够看到实际的编码。在原始“密码”字符串上运行.codepoints
应返回[112, 97, 115, 115, 119, 111, 114, 100]
。