设计:使用两个可能的加密密码登录

问题描述 投票:0回答:2

我的应用程序使用 Devise gem 进行身份验证,但我想自定义它以使用两个可能的加密密码登录,因为我以前的应用程序使用 MD5。我的用户表中有两个字段:加密_密码加密_旧密码(我已创建),我想检查是否存在值加密_密码以及发送的密码是否与一组匹配,否则,检查是否存在使用 MD5,如果为 true,则替换值 encrypted_password

我该怎么做?

ruby-on-rails ruby devise md5 bcrypt
2个回答
2
投票

我不知道我的答案是否奇特,但对我有用。我希望有人可以改进我所做的事情。

class SessionsController < Devise::SessionsController

  def create
    recover_old_password unless user_signed_in?

    resource = warden.authenticate! auth_options
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in resource_name, resource

    respond_with resource, :location => after_sign_in_path_for(resource)
  end

  def recover_old_password

    email = params[:user]['email']
    pass  = Digest::MD5.hexdigest params[:user]['password']

    @user = User.find_by_email_and_encrypted_old_password(email, pass)

    if @user.blank?

      resource = warden.authenticate! auth_options
      respond_with resource, :location => after_sign_in_path_for(resource)

    elsif

      if [email protected]_password.nil?
        @user.encrypted_password = BCrypt::Password.create params[:user]['password']
        @user.save
        create
      end  

    end

  end

end

0
投票

自 Marco 的回答以来已经过去了 12 年,但仍然存在带有 MD5 密码摘要的遗留应用程序。

这是我的解决方案。 OP 想首先检查加密密码,然后检查 MD5 列,但我决定改变顺序。

如果加密的密码已经存在,我不做任何额外的事情。如果不是,并且 pw 参数与旧的 MD5 摘要匹配,我会保存一个新的 crypto_password。我让 devise 处理剩下的所有事情。

为了生成控制器,我运行了

rails g devise:controllers users

class Users::SessionsController < Devise::SessionsController
  def create
    recover_old_password
    super
  end
  def recover_old_password
    email = params[:user]['email']
    pass = params[:user]['password']
    user = User.find_by(email: email)
    # let devise handle these cases
    return if !user || user.encrypted_password.present?

    digest = Digest::MD5.hexdigest(pass)
    if user.old_encrypted_password == digest
      # logger.debug('use this to debug')
      user.encrypted_password = User.new(password: pass).encrypted_password
      user.save
      # be careful! now devise will think the given password is correct
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.