2013-01-03 117 views
2

我使用Sinatra框架來製作一個非常簡單的Web應用程序,它需要登錄會話。Sinatra應用程序在瀏覽器中共享的會話

我可以很好地登錄,但是當我的朋友訪問該網站時,他們以我的身份登錄。我有一個朋友註冊。當我重新訪問該網站時,我以她的身份登錄!我們在不同設備上相距3000英里。

這裏是我的登錄密碼的要點..

require 'rubygems' 
require 'sinatra' 

# I have tried enabling/disabling the :session_secret 
# set :session_secret, 'my_secret' 
enable :sessions 

before '*' do 
    begin 
    User.login(User.find(session[:me])) if session[:me] 
    end 
end 

post '/login' do 
    user = User.find_by_email!(params[:email]).authenticate!(params[:password]) 
    session[:me] = user.id 
    User.login user 
    200 
end 

我也想加入這個我rackup文件

use Rack::Session::Cookie, 
    :key => 'my_app_key', 
    :path => '/', 
    :expire_after => 14400, # seconds 
    :secret => 'secret_stuff' 

的問題是,無論在生產和開發環境。

西納特拉文檔不推薦任何配置超越enable :sessions http://www.sinatrarb.com/faq.html#sessions

+0

什麼是'User.login'的樣子? –

+0

'def login(user); @@ me = user;真的沒什麼意思 – jchook

+1

這是_major_興趣......'@@ me'是一個類變量,它保留了它在類中的價值,並且有一個使用壽命_span多個請求_...所以這可能是你的問題。 –

回答

5
User.login(User.find(session[:me])) if session[:me] 

class User 
    def self.login(user) 
    @@me = user 
    end 
end 

這是你的問題。即使在請求之間,類變量仍然存在。

  1. 您登錄
  2. User@@me被設置爲您的用戶
  3. 別人訪問該網站。
  4. session[:me]nil因爲沒有會話但
  5. User.login不叫,這要麼設置User@@me用戶或爲零。

所以當沒有session[:me]User@@me不會得到改變。

簡而言之,不要使用類變量來存儲應該只保留一個請求的信息。

+0

非常有趣。這就是我如何將「靜態」信息存儲到PHP應用程序中的User類。這些信息應該存儲在Sinatra中? env是否可以從'class User'訪問? – jchook

+0

如果您真的想讓'User'類知道當前登錄的用戶,請確保在_every_ request'session [:me]開始時立即清除'@@ me'? User.login(User.find(session [:me])):User.login(nil)'。否則,您將用戶ID保存在會話中,併爲'@ current_user'創建一個實例變量並傳遞它。這通常是軌道的工作方式,但我不確定Sinatra是否有不同的慣例。 –

+0

這不會是併發請求的問題嗎? (因爲它似乎分開請求「分享」@@ me') – jchook

相關問題