设计:添加哈希列

Devise: Add Hashed Column

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

密码是可选的,因此默认情况下它是空的,并且可以在用户设置页面上更改,由 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

我会在 account_update_params 函数中添加 :pin_number 作为允许的参数之一,但我将如何散列它以及在哪里散列?

我是 rails 的新手,所以如果能向我展示如何散列参数然后将其保存给适当的用户,我将不胜感激。

你可以使用 attr_encrypted gem。

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

并在 encrypted_pin_number 字段中保存 pin_number 的加密版本并像 @user.encrypted_pin_number 那样调用它 returns pin_number.[=17 的加密值=]

您可以为此使用 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