如何使用Cookie正确启动会话,存储并使用Rack会话在Sinatra应用程序中访问它

时间:2012-03-31 19:57:12

标签: session cookies login sinatra rack

我在Heroku上运行了一个Sinatra应用程序。我真的很难为我的用户正确设置cookie。我一直在查看示例和文档几天,似乎无法解决问题。我想让我的用户使用电子邮件和密码登录。如果登录成功,我想创建一个在一段时间后过期的cookie。我希望用户在关闭并重新打开浏览器或者将新代码推送到Heroku时仍然保持登录状态。我认为这只是cookie的正常使用,所以如果有人能帮助我实现它,我将非常感激。

以下是我想法的方式我应该设置帖子'/ login'路线。

post '/login/?' do

  #do_login is a helper method which checks if the user's credentials are correct

  if do_login
    use Rack::Session::Cookie, :key => 'rack.session',
                               :domain => 'www.Feistie.com',
                               :path => '/',
                               :expire_after => 2592000,
                               :secret => 'a_30_character_key',
                               :user_id => params[:user_id]
  end

end

即使这是正确的,我也不太明白。什么是:关键?我假设:域名应该像我一样设置到我的网站。怎么样:路径?为什么:路径设置为'/'?我有没有为我的Rack应用程序设置密钥的地方?我不清楚cookie安全性是如何工作的。我也不确定我是否可以像我一样添加:user_id到哈希。

然后下一部分是设置帮助程序“logged_in?”看看是否有人登录?

def logged_in?
  !session.nil?
end

这可能是错的,但我想我会尝试。

我还需要能够检查当前用户的实际身份。我曾经通过session[:user_id] == @user.id或类似的东西来做这件事。我的主要问题是如何访问cookie中的:user_id值?

最后退出。

post '/logout/?' do
  session.clear
end

如果你们能让我跟上这一切,那就太棒了!提前致谢,如果您需要更多信息,我很乐意提供。

2 个答案:

答案 0 :(得分:3)

这比那简单得多。 http://www.sinatrarb.com/faq.html#sessions

enable :sessions

post '/login/?' do
  if do_login
    session[:user_id] = params[:user_id]
  end
end

post '/logout/?' do
  session[:user_id] = nil
end

我通常会尝试将会话管理保留在getpostbefore等块中的业务逻辑中。您可以使用before过滤器“登录”当前会话的用户。

before '*' do
  set :user_id, session[:user_id]
end

这是完全可选的,但您可以在机架文件中添加任何cookie配置:

use Rack::Session::Cookie, 
    :key => 'rack.session',
    :path => '/',
    :expire_after => 14400, # In seconds
    :secret => 'change_me'

答案 1 :(得分:1)

您可以尝试使用response

进行设置
response.set_cookie "user_id", {:value => params['user_id'], 
                                :expires => (Time.now + 52*7*24*60*60)}

您可以在

到期之前随时阅读
request.cookies["user_id"]

删除Cookie

response.delete_cookie "user_id"

...