【问题标题】:Devise: Add Hashed Column设计:添加哈希列
【发布时间】:2015-11-20 18:44:08
【问题描述】:

我在我的 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

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

我是 Rails 的新手,因此我会很高兴向我展示如何对参数进行哈希处理,然后将其保存给适当的用户。

【问题讨论】:

标签: ruby-on-rails ruby hash devise


【解决方案1】:

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

【讨论】:

  • 如何保存这个散列图钉?我知道如何检索它,但我正在使用设计并且不知道要更改/添加什么。
  • @JoshLukeBlease 我已经更新了我的答案。您需要将该字段添加到您的用户迁移中(或创建一个新迁移以添加 pin 字段)。
【解决方案2】:

您可以为此使用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 的加密值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2017-03-26
    • 2011-07-21
    • 2016-03-18
    相关资源
    最近更新 更多