модуль ActiveRecord::SignedId
Подпись ID Active Record
Публичные методы класса
# File activerecord/lib/active_record/signed_id.rb, line 13 class_attribute :signed_id_verifier_secret, instance_writer: false
Установите секрет, используемый для проверки подписи ID, когда Active Record используется вне Rails. Внутри Rails это автоматически настраивается с помощью генератора ключей приложения Rails.
Публичные методы экземпляра
# File activerecord/lib/active_record/signed_id.rb, line 131 def signed_id(expires_in: nil, expires_at: nil, purpose: nil) raise ArgumentError, "Cannot get a signed_id for a new record" if new_record? self.class.signed_id_verifier.generate id, expires_in: expires_in, expires_at: expires_at, purpose: self.class.combine_signed_id_purposes(purpose) end
Возвращает подписанный ID, сгенерированный с использованием предварительно настроенного ActiveSupport::MessageVerifier экземпляра.
Этот подписанный ID защищен от подделки, поэтому его безопасно отправлять в электронных письмах или иным образом передавать во внешнюю среду. Однако, как и в случае любого сообщения, подписанного с помощью ActiveSupport::MessageVerifier, подписанный ID не зашифрован. Он просто закодирован и защищен от подделки.
Это означает, что любой может декодировать ID; однако, если он подвергся подделке (так, чтобы указывать на другой ID), криптографическая подпись больше не будет совпадать, и подписанный ID будет считаться недействительным и вернёт nil при передаче в find_signed (или вызовет исключение find_signed!).
Кроме того, его можно установить с датой истечения срока действия (по умолчанию не истекает) и ограничить по назначению. Если дата истечения срока действия была пройдена до вызова find_signed, ID не найдёт соответствующую запись. Если установлено назначение, оно также должно совпадать.
Если вы случайно выпустили подписанный ID в общий доступ, который хотите отозвать раньше, чем дата истечения срока действия (или, возможно, вы забыли установить дату истечения срока действия, имея это в виду!), вы можете использовать назначение, чтобы по сути изменить версию signed_id, как показано ниже:
user.signed_id purpose: :v2
Затем измените вызовы find_signed так, чтобы они требовали этого нового назначения. Любые старые подписанные ID, которые не были созданы с назначением, больше не найдут соответствующую запись.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.