在过去的 2 个小时里,我一直在尝试调试 devise 中的一个奇怪问题,该问题不允许我登录。
这也是我提到的内容:
password
=> 'vinodsobale'
password == 'vinodsobale'
=> true
resource.valid_password?(password)
=> false
resource.valid_password?('vinodsobale')
=> true
附上屏幕截图:
注意:我已经在devise内部启用了调试器,因此上面的代码是devise内部代码。
对我来说,这看起来像是 Devise.secure_compare
中的问题。
最佳答案
此问题是由于 Ruby 2.2.0 中已知的字符串损坏错误 fixed 造成的。在2.2.2中。
如 bug report 中所述,当 BCrypt 从其 C 扩展调用特定的字符串创建 API 时,发生了损坏,Devise v3.3.0 通过调用 ::BCrypt::Engine.hash_secret
触发了该 API。来自 Devise::Models::DatabaseAuthenticatable#valid_password?
方法。特定于设计的workaround针对此错误已在 v3.5.0 中发布。
解决方案是:
- 将 Ruby 降级至
< 2.2.0
,或升级至>= 2.2.2
; - 将设备升级至
>= 3.5.0
.
关于ruby-on-rails - 设计 valid_password 的奇怪问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34136044/