我正在使用attr_encrypted来支持我的rails应用程序中的客户数据加密。当密钥是静态的时,gem正在工作,但是当我尝试使用proc从params[:key]
中获取控制器中的密钥时(因此我不需要存储密钥),密钥未正确使用。我目前的代码是:
客户模式:
class Customer < ActiveRecord::Base
belongs_to :store
attr_encrypted :phone, key: proc { |key| "#{key}" } , :attribute => 'phone_number'
客户控制人:
class CustomersController < ApplicationController
def create
if params[:customer][:phone_number].present?
@customer = Customer.new(customer_params)
@customer.store_id = @store.id
key = params[:key]
@customer.phone = params[:customer][:phone_number]
@customer.phone_number
if @customer.save
return_response['new_customer']=1
else
render json: @customer.errors, status: :unprocessable_entity
end
gem说我也可以传递一个类方法作为键。有人知道如何使用它来实现不将密钥存储在数据库中的目的吗?任何帮助将不胜感激。
答案 0 :(得分:1)
根据文档,您可以指定自定义方法或proc以动态获取密钥。两者都假设key
在当前用户的范围内可用。
一种可能的方法是在客户中为密钥
定义一个新的实例变量class Customer < ActiveRecord::Base
attr_accessor :encryption_key
并指示gem将其用作密钥。
class Customer < ActiveRecord::Base
attr_accessor :encryption_key
attr_encrypted :phone, key: :encryption_key, :attribute => 'phone_number'
现在您只需要确保在执行加密之前设置实例变量。您可以在创建客户后立即设置密钥
@customer.encryption_key = params[:key]
或将调用中的属性传递给new
。