Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveRecord::SignedId::ClassMethods

Публичные методы экземпляра

find_signed(signed_id, purpose: nil) Показать исходный код
# File activerecord/lib/active_record/signed_id.rb, line 42
def find_signed(signed_id, purpose: nil)
  raise UnknownPrimaryKey.new(self) if primary_key.nil?

  if id = signed_id_verifier.verified(signed_id, purpose: combine_signed_id_purposes(purpose))
    find_by primary_key => id
  end
end

Позволяет найти запись на основе подписанного идентификатора, который безопасно можно использовать без риска подделки. Это особенно полезно для таких задач, как сброс пароля или подтверждение электронной почты, когда держатель подписанного идентификатора может взаимодействовать с основной записью, но обычно только в течение определенного периода времени.

Период действия подписанного идентификатора задается во время генерации с помощью метода экземпляра signed_id(expires_in: 15.minutes). Если время истекло до попытки подписанного поиска, подписанный идентификатор больше не будет действительным, и будет возвращено значение nil.

Можно дополнительно ограничить использование подписанного идентификатора с помощью назначения. Это полезно, когда у вас есть базовая модель, например, пользователь, у которой могут быть подписанные идентификаторы для нескольких задач, таких как сброс пароля или подтверждение электронной почты. Цель, заданная во время генерации, должна совпадать с целью, заданной при поиске. Если есть несоответствие, снова возвращается nil.

Примеры

signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset

User.find_signed signed_id # => nil, since the purpose does not match

travel 16.minutes
User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired

travel_back
User.find_signed signed_id, purpose: :password_reset # => User.first
find_signed!(signed_id, purpose: nil) Показать исходный код
# File activerecord/lib/active_record/signed_id.rb, line 62
def find_signed!(signed_id, purpose: nil)
  if id = signed_id_verifier.verify(signed_id, purpose: combine_signed_id_purposes(purpose))
    find(id)
  end
end

Работает так же, как find_signed, но вызовет исключение ActiveSupport::MessageVerifier::InvalidSignature, если срок действия подписанного идентификатора истек, цель не совпадает, он предназначен для другой записи или был изменен. Также будет выброшено исключение ActiveRecord::RecordNotFound , если действительный подписанный идентификатор не может найти запись.

Примеры

User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature

signed_id = User.first.signed_id
User.first.destroy
User.find_signed! signed_id # => ActiveRecord::RecordNotFound
signed_id_verifier() Показать исходный код
# File activerecord/lib/active_record/signed_id.rb, line 71
def signed_id_verifier
  @signed_id_verifier ||= begin
    secret = signed_id_verifier_secret
    secret = secret.call if secret.respond_to?(:call)

    if secret.nil?
      raise ArgumentError, "You must set ActiveRecord::Base.signed_id_verifier_secret to use signed ids"
    else
      ActiveSupport::MessageVerifier.new secret, digest: "SHA256", serializer: JSON
    end
  end
end

Экземпляр верификатора, из которого генерируются и проверяются все подписанные идентификаторы. По умолчанию он инициализируется с использованием уровня класса signed_id_verifier_secret, который в Rails берется из Rails.application.key_generator. По умолчанию это SHA256 для дайджеста и JSON для сериализации.

signed_id_verifier=(verifier) Показать исходный код
# File activerecord/lib/active_record/signed_id.rb, line 87
def signed_id_verifier=(verifier)
  @signed_id_verifier = verifier
end

Позволяет указать настраиваемый верификатор, используемый для подписанных идентификаторов. Это также позволяет использовать разные верификаторы для разных классов. Это также полезно, если вам нужно вращать ключи, так как вы можете заранее подготовить свой настраиваемый верификатор для этого. Подробности см. в ActiveSupport::MessageVerifier.

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

Spec-Zone.ru

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