【发布时间】:2017-09-02 05:25:48
【问题描述】:
我们在 devise.rb 中使用以下内容
config.encryptor = :bcrypt
我们想把它改成
config.encryptor = :authlogic_sha512
还编写了代码来解密旧密码并在登录时将其散列到新密码(在会话控制器内)
但是,在更新密码后,在退出和登录时,它给出了一个错误
BCrypt::Errors::InvalidHash (invalid hash):
如果我注释掉错误的原点,这个错误会随机出现。所以我认为设计配置或 user.rb 模型有问题。
用户模型有以下行:
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:auth0, :google_oauth2]
所以步骤顺序是这样的:
- 用户信息在数据库中(现有用户)。使用 bcrypt 加密的密码
- 用户登录并在会话控制器中,我们将密码重新散列到 sha512 并将其存储在 encrypted_password 字段中
- 用户退出
- 用户登录 *** 由于“invalid_hash”错误而无法登录。
知道这里可能是什么问题吗?提前致谢。
编辑:根据要求为上述步骤 2 编写代码:
class Users::SessionsController < Devise::SessionsController
...
...
email = params[:user]['login']
@user = User.find_by_email(email)
return if @user.nil?
# Get old password and salt
bcrypt = BCrypt::Password.new(@user.encrypted_password)
salt = bcrypt.salt
pwd = params[:user]['password']
pass = ::BCrypt::Engine.hash_secret("#{pwd}#{Devise.pepper}", salt)
# If passwords, match, re-hash it with SHA-512
if @user.encrypted_password == pass
@user.password_digest = ::Devise::Encryptors::AuthlogicSha512.digest(pass, Devise.stretches, salt, Devise.pepper)
@user.password_salt = salt
@user.save!
end
我还在 db 表中添加了“password_digest”和“password_salt”,但我的“保存!”然后方法因“未传递额外参数”而失败。
【问题讨论】:
-
#2 的实际源代码可能会有所帮助,因为这可能是问题所在。我假设您正在覆盖 Devise 的
SessionController?怎么样? -
@ma_il 按要求添加了代码。
-
你找到这个问题的解决方案了吗??
-
@abby37 不,没有找到解决方案。
-
你得到了 encrypted_password,那你为什么还需要 password_digest??
标签: ruby-on-rails ruby ruby-on-rails-3 devise