2012-06-22 3 views
0

Я использую dbix :: class вместе с катализатором для взаимодействия с моей базой данных. Однако некоторые из данных, которые я храню, чувствительны, поэтому я хотел бы зашифровать их до того, как он войдет в базу данных (вставлен или обновлен) и расшифрует его, когда он выйдет (выбран). И я знаю, как с помощью этого модуля: DBIx::Class::PassphraseColumn вы можете автоматически иметь зашифрованный пароль при вводе его в базу данных, имея это в файле схемы:dbix :: класс изменить данные столбца перед обновлением или вставить

__PACKAGE__->add_columns(
    '+password' => { 
     passphrase  => 'rfc2307', 
     passphrase_class => 'BlowfishCrypt', 
     passphrase_args => { 
      cost  => 14, 
      salt_random => 20, 
     }, 
     passphrase_check_method => 'check_password', 
    } 
); 

Так что в любое время вы обновить пароль у вас нет чтобы беспокоиться о его шифровании, DBIx просто делает это за вас. Был бы аналогичный способ, когда всякий раз, когда я вставил или обновил значение в столбце, он зашифровал бы его для меня, и всякий раз, когда я его выбрал, он был бы расшифрован для меня? Или, может быть, есть способ добавить метод, который вызывается перед вставкой или обновлением или после выбора, который дает вам возможность манипулировать данными? Благодаря!

+0

Я не знаком с 'DBIx :: Class', но если вы можете сделать это для одного столбца, не можете ли вы построить цикл со всеми своими полями в нем и добавить это для каждого из них? Вы даже можете получить столбцы сначала с помощью инструкции SHOW FIELDS для каждой таблицы. Немного утомительно, и я предполагаю, что есть способ добавить обработчик к 'INSERT',' UPDATE' и 'SELECT', но это начало. – simbabque

+0

Обычно вы добавляете такие методы в свой класс 'ResultSet'. –

ответ

1

Посмотрите на column accessor overloading. Вы можете зашифровать данные в @_, если они не были пустыми, и дешифровать каждый раз, когда вы возвращаете значение. Я изменил пример на этой странице, чтобы лучше удовлетворить ваши потребности:

__PACKAGE__->add_columns(description => { accessor => '_description' }); 

sub description { 
    my $self = shift; 

    # If there is an update to the column, encrypt it before calling the original accessor 
    return $self->_description(encrypt($_[0])) if @_; 

    # Fetch and decrypt the column value. 
    return decrypt($self->_description); 
} 

Вы все еще нужно указать шифровать() и дешифрования(), но это получает вас большую часть пути.

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

  • Нет связанных вопросов^_^