簡體   English   中英

Rails>設計密碼加密

[英]Rails > Devise password encryption

我正在嘗試實現一種方法,允許密碼從設備外的其他服務更改無論如何。

# Profile password change
def change_password(oldpass, newpass)
    pepper  = nil
    cost    = 10

    # Encrypt plain text passwords
    encrypt_old     = ::BCrypt::Password.create("#{oldpass}#{pepper}", :cost => cost).to_s

    # Validate old
    if self.encrypted_password == encrypt_old
        encrypt_new     = ::BCrypt::Password.create("#{newpass}#{pepper}", :cost => cost).to_s
        self.encrypted_password = encrypt_new
        self.save
    else
        Logger.new("Wrong old password!")
    end
end

似乎我得到了密碼加密錯誤oldpass包含舊密碼的純文本我需要哈希它看看它是否與當前密碼匹配然后允許存儲新密碼。 但是我所得到的只是密碼錯誤。

重做:

def change_password(oldpass, newpass)
    if valid_password?(oldpass)
        password = newpass
        save
        return true
    else
        return false
    end
end

如果您在應用程序或Rails控制台中,則無需自己加密密碼。

只需按照以下方式更新用戶,Devise將自行處理。

user.password = new_password
user.save

然后Devise將加密密碼並存儲它。 您只需要確保user.password_confirmationnil 如果password_confirmation是其他任何東西,它將與password匹配。

編輯

您可以使用以下命令檢查現有密碼: user.valid_password?(old_password)

使用Devise,您無需自己處理使用bcrypt。 默認情況下,它處理此更改密碼方法。 你可以在這里查看源代碼或者只在你的Rails應用程序中查看config/intitalizers/devise.rb

另外,如果你使用Devise提供的#update_with_password方法,那么你可以傳遞一個像這樣的哈希:

{ :current_password => 'pass', :password => 'pass_new', :password_confirmation => 'pass_new' }

或者,如果您不希望用戶必須提供確認,則可以省略:password_confirmation

編輯:我使用了錯誤的字段; 它應該是'current_password'而不是'old_password'。

這是Devise源代碼中的方法:

  # Update record attributes when :current_password matches, otherwise returns
  # error on :current_password. It also automatically rejects :password and
  # :password_confirmation if they are blank.
  def update_with_password(params, *options)
    current_password = params.delete(:current_password)

    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    result = if valid_password?(current_password)
      update_attributes(params, *options)
    else
      self.assign_attributes(params, *options)
      self.valid?
      self.errors.add(:current_password, current_password.blank? ? :blank : :invalid)
      false
    end

    clean_up_passwords
    result
  end

在GitHub上查看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM