2013-01-03 74 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

相关问题