使用attr_encrypted与客户提供的密钥(未存储在数据库中)

时间:2014-01-26 07:24:35

标签: ruby-on-rails ruby

我正在使用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说我也可以传递一个类方法作为键。有人知道如何使用它来实现不将密钥存储在数据库中的目的吗?任何帮助将不胜感激。

1 个答案:

答案 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