執行個體公開方法
find_signed(signed_id, purpose: nil) 連結
根據簽署 ID 讓您找到一個記錄,此 ID 可以在全世界安全地使用而不會有動手腳的風險。這在像密碼重設或電子郵件驗證等需要讓簽署 ID 的持有者能夠與底層記錄互動的事情上特別有用,但通常是在特定時間範圍內。
您使用實體方法 signed_id(expires_in: 15.minutes)
在簽署 ID 產生期間設定簽署 ID 的有效時間範圍。如果在嘗試簽署的尋找操作之前時間已過,則簽署 ID 將不再有效,並且會傳回 nil。
可用目的來進一步限制簽署 ID 的使用。當您有像是 User 等一般基本模型時,這很有幫助,它可能會有多個目的的簽署 ID,像是密碼重設或電子郵件驗證。產生期間設定的目的必須與在尋找時設定的目的相符。如果有不符情況,則會再次傳回 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) 連結
運作方式像是 find_signed
,但如果 signed_id
已過期、目的不符、屬於其他記錄或已被動過手腳,它會引發 ActiveSupport::MessageVerifier::InvalidSignature
例外。如果有效的 signed ID 找不到記錄,它還會引發 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() 連結
驗證程式執行個體,所有 signed ID 都由此產生並在此驗證。預設情況下,它會使用類別層級的 signed_id_verifier_secret
初始化,,在 Rails 中,此秘鑰來自於 Rails.application
.key_generator。預設情況下,它使用 SHA256 消化和 JSON 序列化。
# File activerecord/lib/active_record/signed_id.rb, line 81 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, url_safe: true end end end
signed_id_verifier=(verifier) 連結
讓您可以傳入用於 signed ID 的自訂驗證程式。這也讓您可以為不同的類別使用不同的驗證程式。如果您需要輪換金鑰,這也很有幫助,因為您可以事先準備自訂驗證程式。有關詳細資訊,請參閱 ActiveSupport::MessageVerifier
。
來源:顯示 | 在 GitHub 上
# File activerecord/lib/active_record/signed_id.rb, line 97 def signed_id_verifier=(verifier) @signed_id_verifier = verifier end