Spec-Zone.ru › Ruby on Rails 8.1

module ActiveRecord::SignedId

Подписанный идентификатор Active Record

Открытые методы класса

signed_id_verifier_secret () Показать исходный код
# File activerecord/lib/active_record/signed_id.rb, line 15
class_attribute :signed_id_verifier_secret, instance_writer: false

Задаёт секретный ключ, используемый экземпляром проверяющего объекта для подписанного идентификатора при работе с Active Record вне Rails. В Rails он задаётся автоматически с помощью генератора ключей приложения Rails.

Открытые методы экземпляра

signed_id (expires_in: nil, expires_at: nil, purpose: nil) Показать исходный код
# 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.

Spec-Zone.ru

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