奇怪的问题与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]
。