Rails使用attr_encrypted访问私有方法

时间:2016-09-02 17:11:13

标签: ruby-on-rails private-methods 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时,一切似乎都按预期工作。但我显然不希望公开访问该信息(你知道:超级密钥),所以我希望它是私有的。但是,当我包含private时,我收到了错误消息。具体来说:NoMethodError (undefined method 'bytesize' for :encryption_key:Symbol)。我所研究的是attr_encrypted抛出一个错误,因为它没有传递一个密钥,因为私有方法没有被正确访问。

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

所以我真正的问题是:我的私有方法发生了什么,为什么private令人沮丧,甚至在模型的范围内?我认为我做的事情基本上是不正确的,但是我也跟着其他人做过这样的例子,所以对我错误的任何指导都会非常感激!

1 个答案:

答案 0 :(得分:1)

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

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

不可否认,但它应该有效。

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