奇怪的问题与devisevalid_password?

在过去的2个小时里,我一直在试图debugging一个奇怪的问题,不让我login的devise。

以下是我所指的内容:

password => 'vinodsobale' password == 'vinodsobale' => true resource.valid_password?(password) => false resource.valid_password?('vinodsobale') => true 

附加屏幕截图:

在这里输入图像说明 注意:我已经启用了debugging器,所以上面的代码是devise内部代码。

对我来说,它在Devise.secure_compare看起来像一个问题。

这个问题是由于2.2.2中已经修复的 Ruby 2.2.0中已知的string破坏错误引起的。

如错误报告中所述,当BCrypt从C扩展中调用特定的string创buildAPI时,腐败发生, Devise::Models::DatabaseAuthenticatable#valid_password?通过调用::BCrypt::Engine.hash_secret触发Devise v3.3.0, Devise::Models::DatabaseAuthenticatable#valid_password? 方法。 这个bug的devise特定的解决方法已在v3.5.0中发布。

解决scheme是要么:

  • 将Ruby降级到< 2.2.0 ,或升级到>= 2.2.2 ;
  • 升级devise为>= 3.5.0

怎么样

 resource.valid_password?(password.to_s) 

我希望它能帮助你。

deviseDatabaseAuthenticatable#valid_password? 正在使用一个叫做Encryptor::compare的方法取2个对象,当前存储的密码和你要比较的新密码,我相信这个方法会有副作用,修改中间的第二个参数,所以会修改该对象,而不是一次将被修改两次,这导致了一个错误的结果,所以它可以工作,如果你传递一个密码重复的对象。 你可以尝试使用valid_password? password.dup valid_password? password.dup

原始来源和控制台之间的编码可能是一个问题。 如果你运行password.codepoints ,你应该能够看到实际的编码。 在原始“密码”string上运行.codepoints应返回[112, 97, 115, 115, 119, 111, 114, 100] .codepoints [112, 97, 115, 115, 119, 111, 114, 100]