Spec-Zone.ru › Ruby on Rails 8.1

класс ActiveSupport::MessageEncryptors

Атрибуты

transitional [RW]

Если значение равно 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.

Общедоступные методы класса

new(&secret_generator) Показать исходный код
# File activesupport/lib/active_support/message_encryptors.rb, line 34
    

Инициализирует новый экземпляр. secret_generator должен принимать соль и именованный аргумент secret_length и возвращать подходящий секрет (строку) или секреты (массив строк). secret_generator также может принимать другие произвольные именованные аргументы. Если rotate вызывается с параметрами, совпадающими с этими именованными аргументами, они передаются в secret_generator, а не в шифратор сообщений.

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

encryptors.rotate(base: "...")

Общедоступные методы экземпляра

[](salt) Показать исходный код
# File activesupport/lib/active_support/message_encryptors.rb, line 54
    

Возвращает MessageEncryptor, настроенный с секретом, полученным из указанной salt, и параметрами из rotate. Экземпляры MessageEncryptor кэшируются, поэтому для одного и того же salt будет возвращён один и тот же экземпляр.

[]=(salt, encryptor) Показать исходный код
# File activesupport/lib/active_support/message_encryptors.rb, line 65
    

Заменяет экземпляр MessageEncryptor, связанный с указанной salt.

clear_rotations Показать исходный код
# File activesupport/lib/active_support/message_encryptors.rb, line 163
    

Очищает список наборов параметров.

on_rotation(&callback) Показать исходный код
# File activesupport/lib/active_support/message_encryptors.rb, line 172
    

Задаёт обратный вызов, который выполняется при расшифровке сообщения с помощью набора параметров, отличного от первого.

Например, этот обратный вызов может вести журнал при каждом вызове и тем самым показывать, используются ли ещё старые наборы параметров или их можно удалить из ротации.

prepend(**options) Показать исходный код
prepend(&block)
# File activesupport/lib/active_support/message_encryptors.rb, line 126
    

Работает так же, как rotate, но добавляет указанные параметры или блок в начало списка наборов параметров.

Это может быть полезно, если у вас уже есть настроенный экземпляр MessageEncryptors, но вы хотите переопределить способ шифрования сообщений.

module ThirdParty
  ENCRYPTORS = ActiveSupport::MessageEncryptors.new { ... }.
    rotate(serializer: Marshal, url_safe: true).
    rotate(serializer: Marshal, url_safe: false)
end

ThirdParty.ENCRYPTORS.prepend(serializer: JSON, url_safe: true)

# Uses `serializer: JSON, url_safe: true`.
# Falls back to `serializer: Marshal, url_safe: true` or
# `serializer: Marshal, url_safe: false`.
ThirdParty.ENCRYPTORS[:foo]
rotate(**options) Показать исходный код
rotate(&block)
# File activesupport/lib/active_support/message_encryptors.rb, line 74
    

Добавляет options в список наборов параметров. Шифрование Messages выполняется с использованием первого набора в списке. При расшифровке, однако, наборы проверяются по очереди, пока один из них не сработает.

Важно отметить, что параметр :secret_generator может задавать генератор секретов, отличный от указанного изначально. Генератор секретов должен поддерживать call, принимать соль и именованный аргумент secret_length и возвращать подходящий секрет (строку) или секреты (массив строк). Генератор секретов также может принимать другие произвольные именованные аргументы.

Если какие-либо параметры совпадают с именованными аргументами используемого генератора секретов, они передаются генератору секретов, а не шифратору сообщений.

Для настройки ротации отдельно для каждой соли поддерживается вариант с блоком. Блоку передаётся соль, и он должен возвращать подходящий набор параметров в виде Hash. Блок также может возвращать nil, указывая, что ротация не применяется к данной соли. Например:

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]
rotate_defaults Показать исходный код
# File activesupport/lib/active_support/message_encryptors.rb, line 154
    

Вызывает rotate со стандартными параметрами.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API