2011-01-21 25 views
16

Kimlik doğrulaması için kullanılan bir uygulamayı kullanıyorum. Nginx üstüne yolcu ile rubi 1.9.2, 3 rails.Oturumlar geçiyor. Ruby on Rails

İşte benim problem: Ben occaisionally benim oturumları geçti alıyorsanız fark ettik. Tek bir kullanıcı olarak oturum açarken, bazen başka bir kullanıcı olurum. Bu gerçekten korkunç bir sorundur. Active_record oturumları depolamayı kullanarak durmayı başardım. Ama nerede olabileceğine dair söylediklerim var. Çerez depolama alanı ve memcached depolama alanı kullanılır. Hata ayıklamaya nereden başlayacağımı bilmiyorum. Tüm kodlarımı geçtim ve sadece 'current_user' yazmayı okumuyorum. Oturumda herhangi bir kod depolama öğesi yok.

herkes nereye doğru Bana öneri verebilir veya bu oluyor olabilir nasıl?

Güncelleme:

ben kurulum her istek üzerine oturumu, içindekileri dökmek için sayfanın en üstünde bir div. Sadece kullanıcı geçişi değil, tüm oturum. Ne olacağını görmek için oturuma koyduğum bazı kukla değişkenler var. Oturumlar geçildiğinde, (Kullanıcı A, Kullanıcı B olur) Kullanıcı A, şimdi B Kullanıcı'sının sahip olduğu kukla değişkenleri görür. Ve B kullanıcısı çıkış yaptı.

GÜNCELLEME aynı sorunu tam açıklanır burada yığın taşması üzerine başka bir soru bulundu

2: Bir yolcu sorun olabilir gibi görünüyor In Rails, what could cause a user to have another user's session?

? Ama daha da önemlisi, nasıl oluyor da oluyor? Bu bir REAL büyük bir sorundur. Buna nasıl dururuz? Şimdi benim app hizmet etmek Unicorn kullanıyorum 3

GÜNCELLEME. Config.threadsafe'yi ayarlıyorum! ve sadece aktif kayıt oturumlarını kullanmaya başladı. Daha fazla memcached oturumları yok. Sorun gitti. En azından güvenlik deliği tıkalı olduğundan saçlarımı çekmeyi bırakabilirim.

Tam olarak neyin neden kaynaklandığını bilmek isterim. Dışarıdaki öğreticilerin çoğu, varsayılan yumurtlama yöntemiyle yolcuyu nasıl ayarlayacağını gösterir. Doğal olarak, memcached'in diğer yöntemlerde oturum yönetimi için en iyi performansı olacağını düşünürdüm. Özellikle çoklu uygulama sunucu ortamında.

Güncelleme 4

Okay son ve nihai güncelleme. Bu aynı memcached bağlantıyı kullanarak çatallı süreçleri ile ilgili bir sorundu. Ben dalli memcached istemcisi kullanarak ve tek boynuzlu at ya da yolcunun after_fork geri aramada bağlantıyı yeniden düzenleyerek sabitledim.

+0

, aynı tarayıcıdan farklı kullanıcılara kullanıyor musunuz? Yoksa son zamanlarda kullanmadığınız tamamen rastgele bir kullanıcı mı? –

+0

Aynı tarayıcıda ayrı kullanıcılarla giriş yapmadı. Bu ayrı ağlarda bile olur. Kullanıcı A, Kullanıcı B olabilir. Ayrı konumlarda olsalar bile. Rastgele olur ve bulduğum tek şey, her ikisinin de olması için giriş yapmaları gerektiğidir. – demersus

+0

Yolcu meselesi olabilir mi? Tasarlama/yönetme current_user değişkenini önbelleğe alır mı? – demersus

cevap

4

Sana Yolcu (varsayılan) akıllı yumurtlama kullanarak ve Spawning Gotcha kurbanı ediyoruz bahis istekli olurdu.

'muhafazakar' olarak PassengerSpawnMethod ayarlayın ve bu kaybolduğunu görmek. Buna karşı koruma sağlamadığınız sürece, bu kolayca memcache durumunu gösterir. Muhtemelen devise (veya kodunuz) ile benzer bir problem.

Oturumları, fiziksel sunucularda veya yalnızca bir sunucuda çapraz olarak görüyor musunuz?

+0

Şu anda bir makinede varsayılan yumurtlama yöntemi ile yolcu koşuyorum. Mevcut oturum değişkeni, istekler arasında doğru şekilde temizlenmemelidir. Hayal edemem, varsayılan ayarlarla, bu diğer insanlar tarafından bir sorun olarak görülmemiştir. Ben muhafazakar spawn yöntemini deneyeceğim, ama bu tür yolcu kullanmanın bazı faydalarını yener. – demersus

+0

Gerçekten bu oturum değişkeni olsaydı, aynı zamanda harekete geçirici oturumları da etkilerdi, değil mi? Bu yüzden bunu düşünmüyorum. Böyle Memcache sorunlar AÇIKÇA (yani Yakaladım olarak) yolcu belgelerinde seslendi, bu nedenle size örtülü olduğunu sahip olduğundan emin olmalılar, ve değilse, düzeltmek ve Memcache'ı oturumları geri dönün. Dev bir ortamda çoğaltabilir misiniz? – user510365

+0

Bu sorun, activerecord oturumları kullanılarak geçici olarak dinlendirildi. Son zamanlarda uygulamayı sunmak için Unicorn kullanmayı denedim ve Unicorn ile de oluyor gibi görünüyor. – demersus

1

hata raf cache 1.2 veya daha yüksek yükselterek sabitlenebilir kuvvetle muhtemeldir. Bu, şu olabilir:

  1. A kullanıcısı bir sayfa ister. Bir oturum oluşturulur ve yanıtta bir Set-Çerez başlığı döner.
  2. Raf-cache yanlış
  3. B kullanıcısı istediğinde Kullanıcı A'nın oturum kimliği ile Set-Cookie başlığı önbelleğe aynı sayfa ve raf önbellek oturumu kimliğiyle Set-Cookie başlıkları dahil önbelleğe yanıtını hizmet vermektedir https://github.com/rtomayko/rack-cache/blob/master/CHANGES

    : https://github.com/rails/rails/issues/476 ve Nihayet

    https://github.com/rtomayko/rack-cache/pull/52, bu konunun rafa cache 1.2 sürüm notları belirtilen: Kullanıcı A.

Bu iki bilet bu sorunu tartışmakAyrıca çerez oturumu mağaza KULLANMIYORSANIZ bile, oturum kimliği hala bir çerez depolandığını fark, bu yüzden çerez deposu kullanmadığınız zaman bu hata bile hala size can sıkıcı gelebilir.

Bu yardımcı olur umarım.

Johannes