2013-06-04 64 views
0

我通過將其ID存儲在session[user]中進行登錄。我如何在Sinatra'過期'會話?

我不希望用戶從多個設備上的一個帳戶登錄。我希望網站在用戶登錄時過期其他會話。

我該怎麼做?

回答

1

你可以使用一些緩存商店(例如的Memcached/Redis的/數據庫),以保持記錄的登錄用戶作爲userid到sessionid的鍵值對。在創建新會話的代碼塊中,檢查密鑰是否存在。如果有,過期會話ID。創建新的會話並將密鑰存儲到會話ID中。

注意我沒有實現完全相同的用例,但使用memcached做了類似的事情。使用像memcache這樣的服務來存儲這種信息比使用數據庫要快得多。

+0

謝謝隊友!我結束了一個類似的解決方案,我只是將會話ID存儲在數據庫的用戶配置文件中(它不是一個大的應用程序atm),除非當前會話的ID與存儲在數據庫中的ID相同,否則我將用戶簽出。我在登錄時存儲會話ID。 – Dmitry

2

Sinatra中的默認會話只是底層Rack會話對象的別名。您需要直接使用Rack::Session::Cookie而不是enable :sessions設置像過期的選項(如Sinatra FAQ: How Do I Use Sessions?描述):

# config.ru 
use Rack::Session::Cookie, :key => 'rack.session', 
          :domain => 'foo.com', 
          :path => '/', 
          :expire_after => 2592000, # In seconds 
          :secret => 'change_me' 
+0

國際海事組織你問題不對。 – ch4nd4n

+0

非常感謝你的回答,但是像@ ch4nd4n說的那樣,這不是我正在尋找的那個。 – Dmitry