3

所以我在这里以不同的方式提出了这个问题,但没有得到答案,所以我将尝试重新措辞,因为这似乎是一个非常简单的问题。

我有一个带有基于 cookie 的会话的 Rails 应用程序。默认情况下,它们没有任何 expires_at 时间戳,因此会话 cookie 的范围是“会话”。这是你的香草 Rails 会话的东西。

现在我想创建一个“演示用户”功能,我会在 15 分钟后将用户踢出。为此,我想在 Time.now + 15.minutes 的会话 cookie 上设置 expires_at

session[:expires_at] = Time.now + 15.minutes

现在上面的这段代码确实执行了,但它对 cookie 的范围没有影响。范围仍然是“会话”。如何将范围从“会话”更改为日期时间?

如果我在 production.rb 中将整个应用程序的 Session 配置为

:expire_after => 24.hours

然后它会工作......但问题是我想有选择地控制会话cookie的到期日期。

编辑:事实证明,当我设置 session[:expires_at] 时对 cookie 的范围没有影响的原因是因为后续请求正在破坏会话 cookie 并将其重置回会话。仍然不确定该怎么做。

4

2 回答 2

2

也许不是依赖 cookie 过期(请参阅“Ruby On Rails 安全指南”中的第 2.9 节,了解它为什么不好),类似于这个答案,在会话本身(例如)中存储会话创建时的时间戳session[:created_at],然后检查每个请求如果这些“演示用户”需要过期:

before_filter :check_session

def check_session
  # TODO: check session validity
  if session[:demo_user] && session[:created_at] > 15.minutes.ago
    reset_session
    # TODO: redirect to login page
  end
end
于 2013-03-14T07:07:17.567 回答
0

虽然不是非常优雅的方式,但这适用于单个会话:

...
request.env['rack.session.options'] = {expire_after: 15.minutes}
session[:user_id] = 1
...
于 2013-03-11T07:36:53.293 回答