跳至内容 跳至搜索
方法
G
H

实例公共方法

generate_unique_secure_token(length: MINIMUM_TOKEN_LENGTH)

# 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

# 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