跳至内容 跳至搜索

ActiveRecord::Encryption 使用加密上下文来配置用于在特定时间点进行加密/解密的不同实体。

默认情况下,库使用默认的加密上下文。这是 Context,最初通过 config.active_record.encryption 选项进行配置。库用户可以在运行代码块时定义嵌套的加密上下文。

参见 Context

方法
C
P
R
W

实例公共方法

context()

返回当前上下文。默认情况下,它将返回当前上下文。

# File activerecord/lib/active_record/encryption/contexts.rb, line 62
def context
  self.current_custom_context || self.default_context
end

current_custom_context()

# File activerecord/lib/active_record/encryption/contexts.rb, line 66
def current_custom_context
  self.custom_contexts&.last
end

protecting_encrypted_data(&block)

在加密上下文中运行提供的块,其中

  • 读取加密的内容将返回其密文。

  • 写入加密的内容将失败。

# File activerecord/lib/active_record/encryption/contexts.rb, line 57
def protecting_encrypted_data(&block)
  with_encryption_context encryptor: ActiveRecord::Encryption::EncryptingOnlyEncryptor.new, frozen_encryption: true, &block
end

reset_default_context()

# File activerecord/lib/active_record/encryption/contexts.rb, line 70
def reset_default_context
  self.default_context = Context.new
end

with_encryption_context(properties)

配置在运行提供的代码块时要使用的自定义加密上下文。

它支持覆盖 Context 中定义的所有属性。

示例

ActiveRecord::Encryption.with_encryption_context(encryptor: ActiveRecord::Encryption::NullEncryptor.new) do
  ...
end

Encryption 上下文可以嵌套。

# File activerecord/lib/active_record/encryption/contexts.rb, line 33
def with_encryption_context(properties)
  self.custom_contexts ||= []
  self.custom_contexts << default_context.dup
  properties.each do |key, value|
    self.current_custom_context.send("#{key}=", value)
  end

  yield
ensure
  self.custom_contexts.pop
end

without_encryption(&block)

在加密上下文运行提供的块,其中禁用加密

  • 读取加密的内容将返回其密文。

  • 写入加密的内容将写入其明文。

# File activerecord/lib/active_record/encryption/contexts.rb, line 49
def without_encryption(&block)
  with_encryption_context encryptor: ActiveRecord::Encryption::NullEncryptor.new, &block
end