Когда encryption_key
вызывается attr_encrypted
, :passphrase
не был установлен. Ключ шифрования заканчивается хэшем sha1 соли; он должен быть шахом хэша кодовой фразы и соли.Виртуальный атрибут не установлен до того, как attr_encrypted использует указанный виртуальный атрибут для ключа шифрования
Соль генерируется при создании и сохранении в базе данных.
Как использовать виртуальный атрибут :passphrase
в ключе шифрования?
Любые предложения?
Для краткости я пропустил кучу кода.
class Employee < ActiveRecord::Base
require 'digest/sha1'
attr_accessor :passphrase, :ssn
attr_accessible :passphrase, :ssn
attr_encrypted :ssn, :key => proc { |employee| "#{employee.encryption_key}" }
def encryption_key
unless salt?
self.salt = Digest::SHA1.hexdigest(generate_salt)
end
Digest::SHA1.hexdigest([passphrase, self.salt].join)
end
end
class EmployeesController < ApplicationController
def create
@employee = @parent.employees.new(params[:employee])
if @employee.save
redirect_to @parent
else
render action: "new"
end
end
end
Заранее благодарен!
Я предполагаю, что 'passphrase' возвращается к контроллеру внутри' params'? Кроме того, где определяется «соль?»? – jordanpg
Исправить: params [: employee] [: passphrase] – pdjk
И соль - это столбец в базе данных. Итак, если соль? возвращает ноль, генерируется соль. – pdjk