Attr_encrypted порядок атрибутов в ActiveRecord - PullRequest
3 голосов
/ 16 декабря 2011

Вы можете воспроизвести проблему следующим образом:

git clone -b args_order git://github.com/danpal/attr_encrypted.git
cd attr_encrypted/
rake test

1) Error:
test_should_create_an_account_regardless_of_arguments_order(ActiveRecordTest):
ArgumentError: must specify a :key

Вот этот тест:

def test_should_create_an_account_regardless_of_arguments_order
  Account.create!(:key => "secret", :password => "password")
  Account.create!(:password => "password" , :key => "secret")
end

проблема в том, что атрибуты установлены влево -> вправо и: пароль зависит от: ключ, поэтому когда: пароль перед: ключ, ключ равен nil.

Вот почему это зависит:

class Account < ActiveRecord::Base
  attr_accessor :key
  attr_encrypted :password, :key => Proc.new {|account| account.key}
end

, поэтому, если account.key не был установлен раньше: пароль установленперерыв.

Прямо сейчас я шифрую значение каждый раз, когда устанавливается значение атрибута, который должен быть зашифрован:

define_method("#{attribute}=") do |value|
  .....
  send("#{encrypted_attribute_name}=", encrypt(attribute, value)) <---HERE GETS ENCRYPTED
  instance_variable_set("@#{attribute}", value)
end

Я думал, может быть, просто зашифровать атрибут при сохранении в базе данных, но проблема в том, что может быть много зашифрованных атрибутов, а также некоторые люди могут использовать зашифрованный атрибут перед сохранением.Что я могу сделать, чтобы предотвратить это?Кто-нибудь хочет добавить запрос на вытягивание ???

1 Ответ

2 голосов
/ 29 января 2014

Я изменил свою модель, чтобы справиться с этим:

attr_encrypted: ssn,: key => Rails.env.test??'ssn_secret': ENV ['SSN_SECRET']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...