方法
实例公共方法
generate_unique_secure_token(length: MINIMUM_TOKEN_LENGTH) 链接
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/secure_token.rb, line 61 def generate_unique_secure_token(length: MINIMUM_TOKEN_LENGTH) SecureRandom.base58(length) end
has_secure_token(attribute = :token, length: MINIMUM_TOKEN_LENGTH, on: ActiveRecord.generate_secure_token_on) 链接
使用 has_secure_token
的示例
# Schema: User(token:string, auth_token:string)
class User < ActiveRecord::Base
has_secure_token
has_secure_token :auth_token, length: 36
end
user = User.new
user.save
user.token # => "pX27zsMN2ViQKta1bGfLmVJE"
user.auth_token # => "tU9bLuZseefXQ4yQxQo8wjtBvsAfPc78os6R"
user.regenerate_token # => true
user.regenerate_auth_token # => true
SecureRandom::base58
用于生成至少 24 个字符的唯一令牌,因此冲突的可能性非常低。
请注意,与 validates_uniqueness_of 一样,仍然可能在数据库中生成竞争条件。建议您在数据库中添加唯一索引以处理这种不太可能的情况。
选项
- :length
-
Secure Random 的长度,最小为 24 个字符。默认值为 24。
- :on
-
生成值时的回调。当使用
on: :initialize
调用时,值将在after_initialize
回调中生成,否则值将在before_
回调中使用。当未指定时,:on
将使用config.active_record.generate_secure_token_on
的值,该值从 Rails 7.1 开始默认为:initialize
。
源代码: 显示 | 在 GitHub 上
# File activerecord/lib/active_record/secure_token.rb, line 46 def has_secure_token(attribute = :token, length: MINIMUM_TOKEN_LENGTH, on: ActiveRecord.generate_secure_token_on) if length < MINIMUM_TOKEN_LENGTH raise MinimumLengthError, "Token requires a minimum length of #{MINIMUM_TOKEN_LENGTH} characters." end # Load securerandom only when has_secure_token is used. require "active_support/core_ext/securerandom" define_method("regenerate_#{attribute}") { update! attribute => self.class.generate_unique_secure_token(length: length) } set_callback on, on == :initialize ? :after : :before do if new_record? && !query_attribute(attribute) send("#{attribute}=", self.class.generate_unique_secure_token(length: length)) end end end