跳至內容 跳至搜尋
方法
#
C
I
O
R

屬性

[RW] transitional

為 true 時,建立訊息加密時會交換前兩個輪替選項設定。例如,使用下列設定,訊息加密會使用 serializer: Marshal, url_safe: true 加密訊息,並可解密使用下列三種選項設定中任何一種加密的訊息

encryptors = ActiveSupport::MessageEncryptors.new { ... }
encryptors.rotate(serializer: JSON, url_safe: true)
encryptors.rotate(serializer: Marshal, url_safe: true)
encryptors.rotate(serializer: Marshal, url_safe: false)
encryptors.transitional = true

在對應用程式執行滾動式部署時,此功能會很有用,其中尚未更新的伺服器仍必須能夠從已更新伺服器解密訊息。在此情境下,請先使用新的輪替 (例如 serializer: JSON, url_safe: true) 作為第一個輪替和 transitional = true 執行滾動式部署。然後,在所有伺服器更新後,使用 transitional = false 執行第二次滾動式部署。

執行個體公共方法

[](salt)

傳回 MessageEncryptor,它的組態使用從給定 salt 衍生的密碼,以及 rotate 的選項。 MessageEncryptor 執行個體會記住,因此相同的 salt 會傳回相同的執行個體。

# File activesupport/lib/active_support/message_encryptors.rb, line 48
    

[]=(salt, encryptor)

覆寫與給定 salt 關聯的 MessageEncryptor 執行個體。

# File activesupport/lib/active_support/message_encryptors.rb, line 56
    

clear_rotations

清除選項組清單。

# File activesupport/lib/active_support/message_encryptors.rb, line 117
    

initialize(&secret_generator)

初始化新的執行個體。 secret_generator 必須接受 saltsecret_length kwarg,並傳回適當的密碼 (字串) 或密碼 (字串陣列)。 secret_generator 也可能接受其他任意 kwarg。如果 rotate 使用任何符合那些 kwarg 的選項進行呼叫,那些選項會傳遞至 secret_generator 而非訊息加密。

encryptors = ActiveSupport::MessageEncryptors.new do |salt, secret_length:, base:|
  MySecretGenerator.new(base).generate(salt, secret_length)
end

encryptors.rotate(base: "...")
# File activesupport/lib/active_support/message_encryptors.rb, line 31
    

on_rotation(&callback)

設定在使用非第一個選項組解密訊息時呼叫的回呼。

例如,這個回呼可以在每次呼叫時記錄,從而指出是否仍使用舊選項組或可以從輪替中移除舊選項組。

# File activesupport/lib/active_support/message_encryptors.rb, line 123
    

rotate(**options)
rotate(&block)

在選項組清單中加入選項訊息將使用清單中的第一組進行加密。不過進行解密時,會依序嘗試每組,直到其中一組成功為止。

值得注意的是,:secret_generator 選項可以指定與最初指定的不同的金鑰產生器。金鑰產生器必須回應call,並接受 salt 和 secret_length kwarg,並傳回適當的金鑰(字串)或金鑰(字串陣列)。金鑰產生器也可以接受其他任意的 kwargs。

如果任何選項與操作中金鑰產生器的 kwargs 相符,這些選項將傳遞給金鑰產生器,而不是傳遞給訊息加密器。

對於只更換一次性密鑰,支援區塊形式。區塊將接收 salt,並應傳回適當選項 雜湊。區塊也可以傳回 nil 以表示輪替不適用於指定的 salt。例如

encryptors = ActiveSupport::MessageEncryptors.new { ... }

encryptors.rotate do |salt|
  case salt
  when :foo
    { serializer: JSON, url_safe: true }
  when :bar
    { serializer: Marshal, url_safe: true }
  end
end

encryptors.rotate(serializer: Marshal, url_safe: false)

# Uses `serializer: JSON, url_safe: true`.
# Falls back to `serializer: Marshal, url_safe: false`.
encryptors[:foo]

# Uses `serializer: Marshal, url_safe: true`.
# Falls back to `serializer: Marshal, url_safe: false`.
encryptors[:bar]

# Uses `serializer: Marshal, url_safe: false`.
encryptors[:baz]
# File activesupport/lib/active_support/message_encryptors.rb, line 62
    

rotate_defaults

使用預設選項呼叫 rotate

# File activesupport/lib/active_support/message_encryptors.rb, line 111