module ActiveRecord::SignedId
Подписанный идентификатор Active Record
Открытые методы класса
# File activerecord/lib/active_record/signed_id.rb, line 15 class_attribute :signed_id_verifier_secret, instance_writer: false
Задаёт секретный ключ, используемый экземпляром проверяющего объекта для подписанного идентификатора при работе с Active Record вне Rails. В Rails он задаётся автоматически с помощью генератора ключей приложения Rails.
Открытые методы экземпляра
# File activerecord/lib/active_record/signed_id.rb, line 160 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
Возвращает подписанный идентификатор, сгенерированный с помощью предварительно настроенного экземпляра ActiveSupport::MessageVerifier.
Этот подписанный идентификатор защищён от подделки, поэтому его можно безопасно отправлять по электронной почте и иным образом передавать за пределы системы. Однако, как и любое сообщение, подписанное с помощью ActiveSupport::MessageVerifier, подписанный идентификатор не зашифрован. Он лишь закодирован и защищён от подделки.
Это означает, что идентификатор может быть декодирован кем угодно; однако, если его подделать (например, указав другой идентификатор), криптографическая подпись перестанет совпадать, и подписанный идентификатор будет считаться недействительным: при передаче в find_signed он вернёт nil (или вызовет исключение с помощью find_signed!).
Кроме того, для него можно задать срок действия (по умолчанию он не истекает) и ограничить его определённым назначением. Если срок действия истёк до вызова find_signed, идентификатор не позволит найти указанную запись. Если задано назначение, оно также должно совпадать.
Если вы случайно раскрыли подписанный идентификатор и хотите отозвать его раньше срока действия (или, возможно, забыли задать срок действия, хотя собирались это сделать!), можно использовать назначение, чтобы, по сути, создать версию signed_id, например:
user.signed_id purpose: :v2
Затем измените вызовы find_signed так, чтобы они требовали это новое назначение. По старым подписанным идентификаторам, созданным без указания назначения, запись больше не будет найдена.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.