1

Когда 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 

Заранее благодарен!

+1

Я предполагаю, что 'passphrase' возвращается к контроллеру внутри' params'? Кроме того, где определяется «соль?»? – jordanpg

+0

Исправить: params [: employee] [: passphrase] – pdjk

+0

И соль - это столбец в базе данных. Итак, если соль? возвращает ноль, генерируется соль. – pdjk

ответ

0

Попробуйте установить Ssn после ключевой фразы и прочие атрибуты

class EmployeesController < ApplicationController 
    def create 
    ssn = params[:employee].delete(:ssn) 
    @employee = @parent.employees.new(params[:employee]) 
    @employee.ssn = ssn 
    if @employee.save 
     redirect_to @parent 
    else 
     render action: "new" 
    end 
    end 
end 
+0

Отлично. Есть ли какой-либо способ: установить кодовую фразу перед ssn в модели или задержать attr_encrypted до тех пор, пока не будут установлены атрибуты? – pdjk

+0

@pdjk Я верю, что если вы преобразуете params [: employee] в упорядоченный хэш и убедитесь, что: passphrase появляется до: ssn, тогда он должен работать –

Смежные вопросы