我正在尝试将一个项目从attr_encrypted
迁移到rails 7加密。我现在正在进行的测试只是在开发和测试环境上进行的,所以现在不需要迁移数据。
我所做的步骤是:
1.将所有语法从attr_encrypted
更改为encrypts
1.运行bin/rails db:encryption:init
并将这些值添加到开发和测试凭据2.1中。我还尝试使用RAILS_ENV=test bin/rails db:encryption:init
并将其放入测试凭据中,以防不同的数据库需要不同的值
我现在遇到的问题是,每当我运行测试(从干净的数据库开始)时,我都会收到这个错误:
ActiveRecord::Encryption::Errors::Configuration:
key_derivation_salt is not configured. Please configure it via credential active_record_encryption.key_derivation_salt or by setting config.active_record.encryption.key_derivation_salt
不过,如果我进入Rails控制台,我确实会得到以下值:
Credentials[:active_record_encryption]
=> {:primary_key=>"T..", :deterministic_key=>"k..", :key_derivation_salt=>"6.."}
为了解决这个问题,或者至少看看有什么帮助,我在环境Ruby文件中添加了以下几行:
config.active_record.encryption.key_derivation_salt = Credentials[:active_record_encryption][:key_derivation_salt]
config.active_record.encryption.primary_key = Credentials[:active_record_encryption][:primary_key]
config.active_record.encryption.deterministic_key = Credentials[:active_record_encryption][:deterministic_key]
这似乎修复了错误,但是测试失败,因为它似乎正在将值解密为nil
(测试之前通过了OFC)
我是否错过了一个配置步骤?
我认为这些空值来自于没有在数据库中更新它们?我该怎么做呢?
另外,有没有其他方法可以让我不需要将这些行添加到环境文件中?这看起来有点多余。
3条答案
按热度按时间am46iovg1#
在我的例子中,我希望使用初始化器从环境变量中读取加密密钥,而不是使用Rails凭据,我遇到了这个错误。
原来有一个ActiveRecord初始化器,它在
config/initializers
中读取并保存密钥的之前运行,所以如果您稍后编辑Rails.application.credentials
或Rails.application.config.active_record.encryption
,ActiveRecord看到的密钥将是nil
。这解决了我的问题:
我通过阅读代码找到了
ActiveRecord::Encryption.configure
,但似乎没有任何地方记录它,所以要小心,以防它发生变化。rdrgkggo2#
您是否通过迁移手动将最初由
attr_encrypted
提供的属性添加到模型中?由于gem将旧值存储在
fieldname_encrypted
和fieldname_encrypted_iv
中,而表不包含fieldname
,因此解密的值返回为nil。在我的例子中,迁移过程如下所示:
编辑:您是否将
bin/rails db:encryption:init
的结果存储在凭据文件中的环境条目下?即:pftdvrlh3#
我不是Maven,但这项工作对我来说只需更新应用程序即可。