【问题标题】:Sessions in sinatra app being shared across browsers跨浏览器共享 sinatra 应用程序中的会话
【发布时间】:2012-12-18 02:50:48
【问题描述】:

我正在使用 Sinatra 框架制作一个非常简单的 Web 应用程序,该应用程序需要登录会话。

我可以正常登录,但是当我的朋友访问该站点时,他们以我的身份登录。我有一个朋友注册。当我重新访问该网站时,我以她的身份登录!我们在不同的设备上相距 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

我也尝试将它添加到我的机架文件中

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

问题在于生产和开发环境。

Sinatra 文档不推荐任何超出enable :sessions 的配置 http://www.sinatrarb.com/faq.html#sessions

【问题讨论】:

  • User.login 是什么样的?
  • def login(user); @@me = user; end 真的没什么兴趣
  • 这是主要的兴趣...@@me 是一个类变量,它在类中保留它的值,并且具有跨越多个请求的生命周期 i>...所以这可能是你的问题。

标签: ruby session web-applications sinatra


【解决方案1】:
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 不会改变。

简而言之,不要使用类变量来存储应该只针对单个请求持续存在的信息。

【讨论】:

  • 非常有趣。这就是我将“静态”信息存储到 PHP 应用程序中的 User 类的方式。这些信息应该存储在 Sinatra 的什么位置?可以从class User 访问 env 吗?
  • 如果你真的想让User类知道谁当前登录了,请确保在每个开头立即擦除@@me i> 请求session[:me] ? User.login(User.find(session[:me])) : User.login(nil)。否则,您将用户 ID 保存在会话中,并为 @current_user 创建一个实例变量并传递它。这通常是 rails 的工作方式,但我不确定 Sinatra 是否有不同的约定。
  • 这不会成为并发请求的问题吗? (因为它似乎是单独的请求“共享”@@me
  • @jchook 这取决于。通常,基于 ruby​​ 的 webapps 对于单个请求是同步的,并发是通过多个 ruby​​ 进程来处理的。每个进程都有自己的类和类变量,所以这不是问题。但情况并非总是如此,而且可能很棘手。所以最好不要静态存储当前用户。在控制器中创建一个实例并传递它。
猜你喜欢
  • 2015-10-05
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2011-03-07
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多