设计:添加哈希列
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
我在我的 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