Rails 使用 attr_encrypted 访问私有方法

Rails accessing private methods using attr_encrypted

我试图让 attr_encrypted 在将某些数据保存到数据库之前对其进行模糊处理。我需要稍后处理记录器输出,但目前我只想从提交的表单中获取字段数据,加密并保存。

这是我的模型:

class Agreement < ApplicationRecord
  attr_encrypted :test_field, key: :encryption_key

  private

  def encryption_key
      ENV['super_secret_key']
  end
end

我注意到当我注释掉 private 时,一切似乎都按预期工作。但我显然不想让 public 访问该信息(你知道:超级密钥),所以我 想要 它是私有的。但是,当我包含 private 时出现错误。具体来说:NoMethodError (undefined method 'bytesize' for :encryption_key:Symbol)。我深入了解 attr_encrypted 正在抛出错误,因为它没有将密钥传递给它,因为私有方法没有被正确访问。

理论上,在 attr_encrypted 位,我可以只设置 key: ENV['super_secret_key'] 而不是调用方法,但这里的目标是实际创建一个新的 class 和相应的数据库table 通过它我可以保存、存储和轮换我的密钥,这些密钥又被环境变量混淆以提供额外的安全层。

所以我真正的问题是:我的私有方法发生了什么,为什么 private 令人沮丧,即使在模型范围内也是如此?我认为我做的事情基本上是不正确的,但我也遵循了其他人的例子,所以非常感谢任何关于我的错误的指导!

问题是 attr_encrypted 调用是在 class 级别,encryption_key 方法是实例级别。尝试这样做:

class Agreement < ApplicationRecord
  attr_encrypted :test_field, key: ENV['super_secret_key']]
end

诚然未经测试,但应该可以。

真的,虽然私人不再保护它了。您通过 env 从配置文件加载它来正确地做到这一点。只要它没有硬编码在您的存储库中,这就是您主要需要做的。