设计:添加散列列

时间:2015-08-26 16:05:13

标签: ruby-on-rails ruby hash devise

我在我的Rails应用程序中使用Devise,我想创建一个用户的密码存储(并经过哈希处理)的列。

引脚号是可选的,因此默认情况下它是空的,并且可以在Devise提供的用户设置页面上更改。 我有以下代码按预期工作:

class RegistrationsController < Devise::RegistrationsController

  private

  def sign_up_params
    params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
  end

  def account_update_params
    params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password)
  end
end

我会将:pin_number添加为account_update_params函数中允许的参数之一,但是如何将其散列到哪里?

我是rails的新手,所以我很高兴看到如何散列参数然后用适当的用户保存它。

2 个答案:

答案 0 :(得分:0)

您可以使用attr_encrypted gem。

#user.rb
Class User < ActiveRecord::Base
  attr_encrypted :pin_number, :key => 'a secret key'
end

并在pin_number字段中保存encrypted_pin_number的加密版本,并将其称为@user.encrypted_pin_number,并返回加密值pin_number

答案 1 :(得分:0)

你可以使用bcrypt gem(Devise已经在使用它了)。在您的创建/更新操作中,您将看到如下内容:

pin_number = BCrypt::Password.create("1234")

然后按原样将pin_number存储在数据库中。当你检索它时,你会创建一个新的Bcrypt::Password对象:

hashed_pin = @user.pin_number
pin_number = BCrypt::Password.new(hashed_pin)

然后,您可以使用==运算符将原始字符串与BCrypt :: Password对象进行比较(字符串将在比较之前自动进行哈希处理):

hashed_pin == "1234" # true

要在用户模型中使用此功能,您需要将该字段添加到用户迁移中:

# devise_create_users.rb
t.string :pin_number

然后,您可以像模型的任何其他属性一样访问它:

@user = User.find(1)
@user.pin_number = BCrypt::Password.create("1234")
@user.save