【问题标题】:postgres 9.4 ,pgcrypto 0.4.1 , rails 4.2.0, ruby 2.2.0, quoting expected String, got Arel::Nodes::BindParampostgres 9.4,pgcrypto 0.4.1,rails 4.2.0,ruby 2.2.0,引用预期的字符串,得到 Arel::Nodes::BindParam
【发布时间】:2015-03-17 14:46:12
【问题描述】:

尝试创建加密列时出现问题。 OS X 10.9.5

使用 gnupg 2.0.22 创建公钥/私钥:

    gpg -a --export > myKey .key.pub
    gpg -a --export-secret-key myKey > .key.prv

关于这里可能发生什么的任何指示?我有一个带有 ssn 字段的模型 迁移添加为:

    add_column :users, :ssn, :binary

在用户模型中

    has_encrypted_column :ssn

为开发数据库添加了 pgcrpyto 扩展

在 config/initializers/pgcrypto.rb 中

    PGCrypto.keys[.public] = {path: '.key.pub'}
    PGCrypto.keys[.private] = {path: '.key.prv',armored: true, password: 'myPassword'}

轨道c

    User.create(username:'x',ssn:'123-45-6789')

收到此错误,列是 ssn,所以看起来它正在做正确的事情

TypeError: wrong argument type Arel::Nodes::BindParam (expected String)
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `escape_string'
from ... /vendor/ruby/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/quoting.rb:19:in `quote_string'
from ... /vendor/ruby/2.2.0/gems/pgcrypto-0.4.1/lib/pgcrypto/adapter.rb:51:in `pgcrypto_encrypt_string'

以下****是我假设错误所在的位置,但不确定在此处调用什么方法: 找不到太多关于 Arel::Nodes::BindParam 的文档。我假设这应该将值设置为“123-45-6789”,然后使用 pgcrypto_encrypt_string 调用对其进行加密。我验证了密钥是正确的。

     57     def pgcrypto_insert(arel)
     58       if table = PGCrypto[arel.ast.relation.name.to_s]
     59         arel.ast.columns.each_with_index do |column, i|
     60           if options = table[column.name.to_sym]
     61             key = options[:key] || PGCrypto.keys[:public]
     62             next unless key
     63             # Encrypt encryptable columns
     64   *****     value = arel.ast.values.expressions[i]
     65             arel.ast.values.expressions[i] = pgcrypto_encrypt_string(value, key)
     66           end
     67         end
     68      end
     69    end

非常感谢任何指针。很高兴在弄清楚时分叉并执行拉取请求。

【问题讨论】:

  • 我目前正在努力解决这个确切的问题。正如您在下面推测的那样,这确实是由于 Rails 4.2 和 Arel 6.0 引入的更改。修复很重要,但我计划将其作为 PR 提交给 pgcrypto gem。当我开始工作时,我会通知你的!
  • 您可以在github.com/BlinkerGit/pgcrypto 找到适用于 Rails 4.2 的 pgcrypto gem 的一个分支。它还增加了对对称加密的支持(在初始化文件中设置PGCrypto.mode = :symmetricPGCrypto.keys[:symmetric] = 'your_key')。我对 gem 进行了相当大的修改,而且我确信我没有涵盖所有边缘情况,所以请考虑这个 fork 实验性,如果您发现任何错误或异常行为,请告诉我。谢谢!

标签: ruby-on-rails postgresql pgcrypto


【解决方案1】:

猜测是由于 Rails 4.2.0 中的 Arel 6.0

在 Rails 4.1.0、Arel 5.0 中

    Arel::Nodes::BindParams < Arel::Nodes::SqlLiteral < String < Object < BasicObject

在 rails 4.2.0 Arel 6.0

    Arel::Nodes::BindParams < Arel::Nodes::Node < Object < BasicObject

关于如何从 Arel::Nodes::Node 中提取值的任何提示

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多