命名空间
方法
类公共方法
signed_id_verifier_secret 链接
设置签名 ID 验证器实例在 Rails 外部使用 Active Record 时使用的密钥。在 Rails 内部,这会自动使用 Rails 应用程序密钥生成器进行设置。
来源: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/signed_id.rb, line 15 class_attribute :signed_id_verifier_secret, instance_writer: false
实例公共方法
signed_id(expires_in: nil, expires_at: nil, purpose: nil) 链接
返回使用预配置的 ActiveSupport::MessageVerifier 实例生成的签名 ID。
此签名 ID 是防篡改的,因此可以安全地通过电子邮件发送或以其他方式与外界共享。但是,与使用 ActiveSupport::MessageVerifier 签名的任何消息一样,签名 ID 并非加密。它只是被编码并防止篡改。
这意味着任何人都可以解码该 ID;但是,如果被篡改(指向另一个 ID),加密签名将不再匹配,签名 ID 将被视为无效,并在传递给 find_signed 时返回 nil(或使用 find_signed! 引发异常)。
此外,还可以设置其过期时间(默认为不过期),并使用特定的 purpose 进行范围限定。如果在调用 find_signed 之前已超过过期日期,则该 ID 将找不到指定的记录。如果设置了 purpose,则也必须匹配。
如果您不小心将一个不希望其提前过期的签名 ID 泄露到外部(或者您本应设置过期日期却忘了!),您可以使用 purpose 来有效地对 signed_id 进行版本控制,如下所示:
user.signed_id purpose: :v2
然后,您需要修改 find_signed 调用以要求此新的 purpose。任何未创建时带有该 purpose 的旧签名 ID 将不再能找到记录。
来源: 显示 | 在 GitHub 上
# 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