我在我的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的新手,所以我很高兴看到如何散列参数然后用适当的用户保存它。
答案 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