dbix :: class在更新或插入之前修改列数据

时间:2012-06-22 04:54:59

标签: perl encryption catalyst dbix-class

我正在使用dbix :: class和catalyst来与我的数据库进行交互。但是,我存储的一些数据是敏感的,所以我想在它进入数据库(插入或更新)之前加密,并在它出来(选中)时解密。我知道如何使用这个模块:DBIx::Class::PassphraseColumn通过在模式文件中将此密码放入数据库中,您可以自动加密密码:

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

因此,无论何时更新密码,您都不必担心加密密码,DBIx只会为您完成。是否有类似的方式,每当我插入或更新一个值的列,它会为我加密它,每当我选择它时,它将被解密为我?或者有没有办法添加一个在插入或更新之前调用的方法,或者在一个让您有机会操作数据的选择之后?谢谢!

1 个答案:

答案 0 :(得分: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);
}

你仍然需要指定encrypt()和decrypt(),但这会让你大部分都在那里。