【问题标题】:dbix::class modify column data before update or insertdbix::class 在更新或插入之前修改列数据
【发布时间】:2012-07-23 15:53:50
【问题描述】:

我正在使用 dbix::class 和催化剂与我的数据库进行交互。但是,我存储的一些数据是敏感的,所以我想在它进入数据库之前加密(插入或更新)并在它出来时解密(选择)。我知道如何使用这个模块: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 会为您完成。是否有一种类似的方式,每当我在列中插入或更新一个值时,它会为我加密它,每当我选择它时,它都会为我解密?或者也许有办法添加一个在插入或更新之前或在选择之后调用的方法,让您有机会操作数据?谢谢!

【问题讨论】:

  • 我不熟悉DBIx::Class,但是如果您可以为一列执行此操作,您不能构建一个包含所有字段的循环并为每个字段添加此内容吗?您甚至可以先使用SHOW FIELDS 语句为每个表获取列。有点乏味,我想有一种方法可以将处理程序添加到INSERT、UPDATE 和SELECT,但这是一个开始。
  • 通常您会将此类方法添加到您的ResultSet 类中。

标签: perl encryption catalyst dbix-class


【解决方案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(),但这可以帮助您完成大部分工作。

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多