SORU
16 Mayıs 2011, PAZARTESİ


En iyi token eşsiz Raylar oluşturmak için?

Kullanıyorum işte. Belirteç mutlaka tahmin haber olmak zorunda değil, başka bir şey daha kısa bir url tanımlayıcısı gibi, ve kısa tutmak istiyorum. Online ve bir çarpışma durumunda buldum bazı örnekler takip ediyorumSanırımaşağıdaki kod belirteci yeniden olacak, ama tam olarak emin değilim. Bu kenarlarda biraz kaba hissediyor kadar iyi bir öneri, ama bakın, merak ediyorum.

def self.create_token
    random_number = SecureRandom.hex(3)
    "1X#{random_number}"

    while Tracker.find_by_token("1X#{random_number}") != nil
      random_number = SecureRandom.hex(3)
      "1X#{random_number}"
    end
    "1X#{random_number}"
  end

Benim veritabanı sütun simgesi benzersiz bir dizin ve ben de kullanma validates_uniqueness_of :token model, ama çünkü bu oluşturulan gruplar otomatik olarak dayalı bir kullanıcının eylemlerin uygulama (onlar sipariş ve satın belirteçleri, aslında, bulunamadığı için bu uygulama atmak bir hata.

Ben de, sanırım, azaltmak için şans çarpışmalar, ekleme başka bir dize sonunda, bir şeyler üretilen dayandığı zaman ya da bir şey gibi, ama istemiyorum token almak çok uzun.

CEVAP
24 AĞUSTOS 2012, Cuma


-- Güncelleme --

Gibi9 Ocak 2015.çözüm aşağıda açıklanan ActiveRecord's secure token implementation lehine önerilmiyor.

-- -- Kaldırılmış

Sadece ileride başvurmak için güvenli rastgele token oluşturma ve sağlama modeli Ruby 1.9 ve ActiveRecord kullanıldığında) teklik:

class ModelName < ActiveRecord::Base

  before_create :generate_token

  protected

  def generate_token
    self.token = loop do
      random_token = SecureRandom.urlsafe_base64(nil, false)
      break random_token unless ModelName.exists?(token: random_token)
    end
  end

end

Düzenleme:

@kain önceki uygulama gelecekte kaldırılmış olabilir çünkü ben kabul ettim, bu cevap loop do...break unless...end begin...end..while değiştirmek için önerdi.

Edit 2:

Ve endişeleri Rails 4 ile, endişe bu hareket tavsiye ederim.

# app/models/model_name.rb
class ModelName < ActiveRecord::Base
  include Tokenable
end

# app/models/concerns/tokenable.rb
module Tokenable
  extend ActiveSupport::Concern

  included do
    before_create :generate_token
  end

  protected

  def generate_token
    self.token = loop do
      random_token = SecureRandom.urlsafe_base64(nil, false)
      break random_token unless self.class.exists?(token: random_token)
    end
  end
end

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • spyib

    spyib

    9 Ocak 2007
  • Valdorsha

    Valdorsha

    8 Mayıs 2006
  • vgeller1

    vgeller1

    22 Kasım 2009