7

我正在使用session[:hash_name]ruby​​ on rails 来保存会话信息,例如用户名和内容。

我正在尝试找到一种方法来使此会话到期而无需用户注销。特别是在两种情况下:一段时间后它需要过期以及当用户关闭浏览器时。

到目前为止,我发现了另一个参数cookies[:hash_name],它可以在一段时间后过期。但我不确定如何在每个用户请求中检查此参数,然后调用 reset_session。重置会话后,我需要将用户重定向到登录页面。

非常感谢解决这两个问题的任何建议。

4

3 回答 3

5

您可以将会话存储在 cookie 中,该 cookie 默认为会话 cookie(意味着当用户关闭浏览器时它会消失),并使用:expire_after.

这可以在config/initializers/session_store.rb. 例如:

Yourapp::Application.config.session_store :cookie_store, 
                                         key: 'your_session_id',
                                         expire_after: 45.minutes
于 2013-04-09T06:30:47.723 回答
1

好吧,我很确定如果你运行session.delete(:hash_name)它会破坏会话,但是强烈建议你不要尝试构建自己的身份验证系统,特别是当你需要花费几个小时来构建最基本的功能时,而预构建的解决方案可以在 20 分钟内安装。不仅如此,预建解决方案的安全性可能是您自己制作的任何解决方案的两倍,因为它已经过无数开发人员的测试和测试。

我强烈建议使用设计进行身份验证。使用 devise 您可以获得诸如 之类的方法sign_out(current_user),这显然会注销发出请求的用户。看看devise的github页面

只需gem install devise将其添加到您的 gemfile 中,然后运行

rails g devise:install User # or whatever model name

他们处理其余的

于 2013-04-06T19:37:43.930 回答
0

我猜您正在使用自己的自定义身份验证方法。因此,对于场景 1(即一段时间后会话到期),您可以执行类似于以下给出的操作:

def create_session
  if session[:hash_key]
    destroy_session if session[:last_login] < 10.minutes.ago
    session[:last_login] = Time.now
  else
    ... authenticate
    session[:last_login] = Time.now
  end
end

def destroy_session
  reset_session
end

对于方案 2(即在浏览器关闭时),您可以调用使用 jquery 事件处理程序,并且可以执行以下操作:

$('window').unload(function(){
  //call to destroy session method
});
于 2013-04-08T11:11:16.877 回答