SaaS uygulamalarında kullanıcı oturumu zaman aşımı yönetimi - çeşitli yaklaşımları tartışmak


11

Bunun yinelenen olarak işaretlenme şansının büyük olduğunu biliyorum, ancak tam olarak aradığım şeyi bulamadım

Bu yaygın bir sorundur ve eminim bazı iyi tanımlanmış en iyi uygulama çözümlerine sahiptir

Arka fon

  1. Tek bir sayfa SaaS uygulaması, çok fazla sürükle ve bırak özelliği var, kullanıcı belirli bir süre boyunca çok fazla sunucu iletişimi olmadan onunla etkileşime girebilir

  2. Sunucu oturumu, kalıcı olmayan bir oturum çerezi kullanarak yalnızca kullanıcı nesnesini tutar

  3. Oturum, sunucuda X saat sonra dolar

  4. Bazı şeyler yalnızca giriş sırasında yüklenir

Sorun

  1. Kullanıcı uygulamada çalışır, bittiğinde kullanıcı oturumu kapatmaz, sadece tarayıcıyı açık tutar
  2. Kullanıcı X saatten uzun bir süre sonra geri döner (oturum sunucuda geçersiz kılınır)
  3. Kullanıcı bir sunucu bağlantısına ihtiyaç duymadan uygulama ile etkileşime girer (şeyleri sürükler ve bırakır, metin düzenlemeleri ...)
  4. Yalnızca bir sonraki sunucu etkileşiminde (otomatik kaydetme olmadığını varsayalım) kullanıcı giriş sayfasına atılır ve işlerinin bir kısmını kaybeder

Olası çözümler

İşte aklımdaki bazı çözümler, başkaları olup olmadığını ve herhangi biriyle ilgili temelde yanlış bir şey olup olmadığını duymak istiyorum.

1. Kullanıcıyı asla çıkış yapmayın

  • Nasıl? ya uzun bir oturum tutun, kalıcı bir çerez tutun ya da javaScript "canlı tutun" ping
  • Artıları : kullanıcının hiçbir şey için endişelenmesine gerek yok, onlar için sorunu çözüyor
  • Eksileri : PCI uyumlu değil, güvenli değildir ve geliştirme değişikliklerine ihtiyaç duyar, örn. Yalnızca kullanıcı oturum açtığında oturuma yüklenen şeyler bir pub alt modeline (olay değişikliklerini dinleyerek) geçmeli veya önbellek zaman aşımına sahip olmalıdır.

2. Yerel Depolama

  • Nasıl? Oturum kapalıysa durumu geçici olarak depolamak, giriş sayfasına yönlendirmek, oturum açıldıktan sonra da devam etmek için yeni yerel depolama alanı kullanın
  • Artıları : Ayrıca, yalnızca oturum zaman aşımı ile uğraşmakla kalmayıp "çevrimdışı çalış" desteği için de temel oluşturur
  • Eksileri : uygulanması daha zor, veri ağacının durum birleştirmesini yapmanız gerekiyor, tüm tarayıcılar desteklemiyor

3. Otomatik kaydet

Modeli değiştiren her kullanıcı eylemi hemen devam etmelidir (veya bir tür istemci tarafı kuyruğu yoluyla), örneğin bir onay kutusunu işaretlerse, bir metin alanını değiştirirse veya bir şey yapıldıktan sonra değişiklikleri devam ettirirse sürükleyip bırakmalıdır.

  • Nasıl? Modeli bağlamak için bir MV ** çerçevesi (Backbone.js / Knockout.js / Ember.js / Angular.js vb.) Kullanın ve değişikliklere devam edin.
  • Artıları : Temiz bir çözüm gibi görünüyor, kullanıcı aktif olduğu sürece oturum aktiftir, devam etmeden istemci tarafı işi yapılmaz.
  • Eksileri : Bir oturum zaman aşımı kaybolduktan sonra kullanıcının yaptığı son eylem.

4. Oturum süresi dolduktan sonra kullanıcının oturumunu kapatın

bunun birkaç yaklaşımı olabilir

  1. Sunucuya "oturumun süresi doldu" deyin - sunucuya sadece soru oturumu genişlettiği için (zaman aşımını yeniden başlatır), bu bir yakalama 22 / Schrodinger'in kedisidir.

    • Nasıl? Ya böyle bir soruyu destekleyen bir sunucum var (hiçbirini bilmiyorum, ama Java toprağından geliyorum) ya da biri sadece oturum kimlikleri tablosunu tutabilir ve son erişim süresini manuel olarak alabilir ve oturumu geçerek sunucuya sorabilir Tanımlama bilgisi yerine bir parametre olarak ID, bunun mümkün olup olmadığından emin değilim, ancak tehlikeli, güvensiz ve kötü bir tasarım whatsoever.login sayfasında görünüyor, giriş yaptıktan sonra devam ediyor
    • Artıları : Sunucularda böyle bir yerel destek varsa, temiz ve meşru bir soru gibi geliyor (X kullanıcısının hala bir oturumu olup olmadığını soruyorlarsa yenilerken sormuyorlar)
    • Eksileri : Sunucu desteklemiyorsa (ve yine, herhangi bir sunucu veya çerçevenin bu işlevselliğe sahip olup olmadığını bilmiyorum), geçici çözüm potansiyel olarak büyük güvenlik risklerine sahiptir.
  2. Duyduğum bir çözüm, sunucu tarafında kısa bir oturum ve maksimum sayıda ping olan canlı bir istemci tarafı pingi yapmaktır.

    • Nasıl? Sunucuda kısa oturum, istemci her oturumda ping yaparTimeOut / 2, maksimum Y yeniden deneme özelliğine sahiptir.
    • Artıları : Bir çeşit sorunu giderir, hızlı ve kirli
    • Eksileri : Bir saldırı gibi hissediyor, sunucunun bunu yapmasına izin vermek yerine oturum yenilemeyi kendiniz hallediyor
  3. İstemci tarafı zamanlayıcısı

    • Nasıl? İstemci tarafında bir zamanlayıcı bulundurun ve kullanıcı sunucuya herhangi bir istek göndermedikten sonra, maksimum sunucu oturumu zaman aşımı eksi bazı dolgulara eşit olması için her istekte yeniden başlatarak sunucu ile senkronize edin. mola vermek üzere, devam etmek istiyor musunuz? " (çevrimiçi bankacılıkta olduğu gibi)

    • Artıları : Sorunu düzeltir

    • Eksileri : Senkronizasyonun çalıştığından emin olmanın dışında herhangi bir şey düşünemiyorum

Soru

Muhtemelen yukarıdaki analizde bir şey eksik, aptalca hatalar olabilir ve bunları düzeltmek için yardımınızı istiyorum. Bunun için başka hangi çözümlere sahip olabilirim?


Ben tastypie ile açısal ve django kullanıyorum, bu yüzden bu bakış açısından düşüncelerim: 4.1: Tüm kaynaklarınız için kullanılan Kimlik Doğrulama sınıfı, şimdi ile Kullanıcı'nızdaki "son erişim" alanının değeri arasındaki zaman farkını kontrol edebilir ve karşılaştırabilir modeli. 401, zaman yapılandırılan zaman diliminden daha büyüktür. 200 aksi takdirde 'son erişim' alanını ile güncelleyin now. 4.2 sunucunuzu öldürmek ve maliyetleri artırmak için harika bir yol gibi geliyor 4.3 Android'de, ana ekrana geri döndüğünüzde işlemin duraklatıldığından ve bu durumun istemcinizin zamanlayıcısını etkileyebileceğinden eminim.
airtonix

Yanıtlar:


5

En yaygın basit çözüm, normal zaman aşımı penceresinin belirli bir bölümü geçtikten sonra bir mesaj gösteren istemci sonunda bir zamanlayıcı ayarladığınız ve daha sonra herhangi bir işlem yapmazlarsa oturumun sona ermesinden hemen önce bunları zorla kaydeder.

Yerel depolama ve otomatik kaydetme, işlemlerle ve kaydedilenin gerçekten ne anlama geldiğiyle ilgili bazı sorunları beraberinde getirir. Kullanıcı tabanının arkasındaki mekaniği anlamadığı zaman değerinden daha fazla sorun olduğu ortaya çıkan birkaç projede bulundum.

Hiçbir zaman çıkış yapmak yönetmeliklerin izin verdiği yerlerde yapılabilir, ancak birisi beklenmedik bir şekilde oturumu kapatırsa ne olduğunu doğru şekilde işlemediğiniz hatalara yol açar ve izlenecek çok şey varsa tüm devlet işleri biraz yoğunlaşır "aktif" bir kullanıcı.


2

Duyduğum bir çözüm, sunucu tarafında kısa bir oturum ve maksimum>

Nasıl? Sunucuda kısa oturum, istemci her oturuma ping atıyorZaman / 2, maksimum Y yeniden denemesine sahiptir.

Bence bu en iyi çözüm. Neden "kirli bir hack" olarak değerlendiriyorsunuz?

Tam olarak ne yapılması gerektiğini yapar. Kullanıcı programla çalışırken oturum açık kalacaktır.

Kullanıcı programla çalışmayı bıraktıktan sonra oturum kapatılacaktır.

Uygulanacak kadar basit.

Soruyu doğru anladıysam tam olarak neye ihtiyaç duyulur.


Bazen kirli kesmek en iyi çözümdür :) teşekkürler. Soruyu mükemmel bir şekilde anladınız
Eran Medan

2

Aslında bununla ilgilenen bir uygulama oluşturuyorum.

Django, Guradian ve Tastypie kullanarak RESTful hizmeti oluşturarak başladım. Yalnızca APIKEY kullanarak kimlik doğrulaması yapar, nesnelere yetkilendirme Guardian tarafından gerçekleştirilir.

Django uygulaması sadece base.html yükler bir şablon görünümü urlconf vardır ...

İstemci tarafında Angular kullanarak bir uygulama oluşturdum.

Kimlik doğrulamaya gelince, 401 yanıtı dinleyen bir http-auth-interceptor vardır.

Bir 401 alındığında, giden istek arabelleğe alınır ve "oturum açma gerekli" bir olay başlatılır. Bu birkaç kez ortaya çıkabilir.

"Giriş gerekli" olay duyulduğunda sunulan bir giriş formu içeren kalıcı bir pop-up var ve aynı zamanda APIKEY içeren bir kullanıcı kaynağı (bir JSON paketi) döndüren bir oturum açma gerçekleştirir.

Önceden 401 yanıtıyla sonuçlanan tüm arabelleğe alınan istekler, Yetkilendirme http başlığında bulunan APIKEY ile yeniden yürütülür.

Localstorage json verilerini yönetmek için başka bir açısal hizmet / fabrika kullanıyorum ve burası kullanıcı adını ve apikey'i depoladığım yer.

Çözülmesi gereken bulmacanın tek parçası, bu bilgilerin nasıl güvence altına alınacağı ve bu bilgiler üzerinde zaman aşımının nasıl uygulanacağıdır.

Belki de son geçerli http isteğinden bir zaman damgası denetimi kullanın.


Bu bir takip olarak, her bir tastypie kimlik doğrulama kontrolü üzerinde aşağıdaki karşılaştırmayı yapmayı düşündüm: current_time> user.lastlogin_time + settings.SESSION_TIMEOUT. sonra doğruysa 401 döndür. Her geçerli kimlik doğrulaması user.lastlogin_time değerini current_time olarak günceller.
airtonix

Bu oldukça güzel ve nasıl ele alacağımı da düşündüm.
oligofren

1

Benim durumumda, 4.1'e benzer bir şey kullanıyorum. Kullanıcı çok hafif bir açısal güdümlü AJAX json oturum sonra sonra sunucuya ayarlanan aralıklarla REST API için oluşur. Güvenlik gereksinimleri nedeniyle, tescilli kullanıcı arabirimi, sunucunun sunucu tarafında bazı korumalı bilgileri, şablonları, verileri vb. Depolayan kullanıcı için bir oturum sürdüreceğini öngörür. Bu hala güvenlik açısından benim tercih ettiğim yöntem. Hassas verilerle uğraşırken (sadece karma parolalar ve benzeri değil), IMO'yu Yerel Depolama'da depolayan vb. Sunucu tarafında daha büyük bir risk oluşturur (eminim birisi bunu benimle tartışır). Üçüncü taraflar sistemle iletişim kurarken aynı API'yı kullanır, ancak her istekte kimlik doğrulama bilgilerini göndermeleri gerekir.

Sunucudaki oturumun kendisine en fazla boşta çalışma süresi vardır ve oturum depolama altyapısı yeniden belleğe alınır (bu da bellek oturumunun süresinin dolduğu işaretlenen bir maksimum kullanım ömrüne sahiptir). Ömür boyu, uygulamanızda özetlediğiniz oturum ömründen daha büyük olmalıdır (ve benim çok fazla olmak zorunda değilsiniz). EG Sunucunun, sunucu açısından 48 saat boyunca boşta kalana kadar süresi dolmayabilir, ancak kodunuz gerçek kullanım ömrünü kontrol eder. Bu, kullanım ömrü çok büyükse ve oturumları yönetmek için kötü bir iş çıkarırsanız kaynak sorunlarına yol açabilir.

Benim durumumda, farklı kullanıcılar kuruluş içindeki rollerine göre farklı oturum boşta kalma zaman aşımlarına sahip olabilir. Sunucu, oturum ömrüne maksimum sınırlar koyar, ancak kullanıcı tanımlı sınırlar bu sınırlardan daha az olduğu sürece, gayet iyi çalışır. Sunucunun oturumu sona erdiğinde, oturumun sona erme süreci uygulama tarafından zaten zarif bir şekilde ele alınacağı için tartışılan bir konudur. Bu, oluşturduğum iş uygulaması türünün bir gereğidir.

Kullanıcılar oturumu boşta kaldığında ve uygulama tarafından belirlenen bir eşik içinde olduğunda, API kullanıcı arayüzüne bir geri sayım iletişim kutusu görüntülemesini bildirir (bankaların yaptığı gibi) ve bir kez sona erme tarihinden itibaren belirli bir mesafe içinde olduğunda kullanıcının oturumunu kapatır. Bu işlevsellik tarayıcı pencerelerinde devam eder (sunucu kontrol altında olduğu için) ve herhangi bir pencerede boşta kalan bir olay zarif zamanlayıcı ve otomatik oturum kapatma işlemine başlar (ve bunları senkronize halde tutar).

Şans eseri oturumun süresi nezaketsiz bir şekilde sona ererse (oturumlar memcached'a dökülür), sunucuyu etkileyen bir sonraki istek kullanıcıyı bilgilendirir ve tekrar kareye geri taşır (nadiren olur, ancak olabilir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.