在Rails 3中设置会话超时



这似乎很简单:我试图让我的rails活动记录会话超时2分钟后。所以两分钟后,我希望我的用户必须重新登录。

我只是在我的本地开发机器上运行rails server(即WebBrick)。

我知道这与config/initalizers/session_store.rb中的以下代码有关,但我认为我还没有完全确定它:

CodedOn::Application.config.session_store :active_record_store
CodedOn::Application.configure do
    config.action_controller.session = {:expire_after => 2.minutes}
end

这似乎不起作用,或者至少我的会话没有超时。我找不到太多关于Rails 3的方法,因为我知道Rails 2.x已经改变了。

谁能帮我一下吗?

我认为您将不得不手动执行此操作,因为活动记录存储不实现expire_after选项。在你的(我假设)before过滤器中,你应该这样做:

def authenticate
  if session[:logged_in]
    reset_session if session[:last_seen] < 2.minutes.ago
    session[:last_seen] = Time.now
  else
    ... authenticate
    session[:last_seen] = Time.now
  end
end

显然,这是不完整的,但它应该给你一个基本的概念。

:

似乎这个功能从2.3版开始就出现在rails中了。我在这里找到了相关的代码。这是AbstractStore,它应该作为所有派生类的基类。因此,正如dadooda所建议的,以下操作应该可以工作:

Some::Application.config.session_store :active_record_store, {
  expire_after: 24.hours,
}

我用一种简单的方法做到了这一点,你可以试试这个:

在你的config/initializers/session_store.rb只是这样做:

Yourapp::Application.config.session_store :cookie_store, 
                                             :key => "_yourapp_session",
                                             :expire_after => 2.minutes

这对我很有效,希望对你也有效。

你必须手动操作。下面是为ActiveRecord会话创建类方法的示例。您可以使用Rufus-Scheduler和/或DelayedJob定期调用它。

class Session < ActiveRecord::Base
  def self.sweep(time = 1.hour)
    if time.is_a?(String)
      time = time.split.inject { |count, unit| count.to_i.send(unit) }
    end
    delete_all "updated_at < '#{time.ago.to_s(:db)}' OR created_at < '#{2.days.ago.to_s(:db)}'"
  end
end

更多关于其重要性的背景信息:http://guides.rubyonrails.org/security.html#session-expiry

moch说:

我认为您将不得不手动执行此操作,因为活动记录存储不实现expire_after选项。

似乎不再是这样了。:expire_after在Rails 3.2.11中为我工作:

Some::Application.config.session_store :active_record_store, {
  key: "some_session_id",
  domain: ".isp.com",
  expire_after: 24.hours,
}

cookie在每次向应用程序发出请求后都会自动延长。会话一直持续到浏览器退出。

我做了上面的技巧来跨域"全球化"会话以实现简单的SSO功能,到目前为止似乎还有效。

过期时间

MAX_SESSION_TIME = 60 * 60
before_filter :prepare_session
def prepare_session
   if !session[:expiry_time].nil? and session[:expiry_time] < Time.now
      # Session has expired. Clear the current session.
      reset_session
   end
   # Assign a new expiry time, whether the session has expired or not.
   session[:expiry_time] = MAX_SESSION_TIME.seconds.from_now
   return true
end

只要在你的模型中添加timeout_in方法,它就会奏效了:

<>之前def timeout_in2.分钟结束

相关内容

  • 没有找到相关文章

最新更新