【问题标题】:Rails cookie based sessions: mixing session scope with expiration timesRails 基于 cookie 的会话:将会话范围与过期时间混合
【发布时间】:2013-02-22 02:29:29
【问题描述】:

所以我以不同的方式提出了这个问题 here 并没有得到任何答案,所以我将尝试改写它,因为这似乎是一个非常简单的问题。

我有一个带有基于 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 的范围没有影响的原因是因为后续请求正在破坏 session cookie 并将其重置回 session .还是不知道该怎么办。

【问题讨论】:

    标签: ruby-on-rails session


    【解决方案1】:

    也许不是依赖 cookie 过期(请参阅"Ruby On Rails Security Guide" 中的第 2.9 节,了解它为什么不好),类似于this answer,在会话本身中存储会话创建时的时间戳(比如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
    

    【讨论】:

    • 对于 OP 所描述的内容,我喜欢这个解决方案。它肯定会满足您的要求,避免处理 cookie 过期问题,并让您 100% 控制演示会话的过期时间。
    【解决方案2】:

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

    ...
    request.env['rack.session.options'] = {expire_after: 15.minutes}
    session[:user_id] = 1
    ...
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多