我正在使用session[:hash_name]
ruby on rails 来保存会话信息,例如用户名和内容。
我正在尝试找到一种方法来使此会话到期而无需用户注销。特别是在两种情况下:一段时间后它需要过期以及当用户关闭浏览器时。
到目前为止,我发现了另一个参数cookies[:hash_name]
,它可以在一段时间后过期。但我不确定如何在每个用户请求中检查此参数,然后调用 reset_session。重置会话后,我需要将用户重定向到登录页面。
非常感谢解决这两个问题的任何建议。
我正在使用session[:hash_name]
ruby on rails 来保存会话信息,例如用户名和内容。
我正在尝试找到一种方法来使此会话到期而无需用户注销。特别是在两种情况下:一段时间后它需要过期以及当用户关闭浏览器时。
到目前为止,我发现了另一个参数cookies[:hash_name]
,它可以在一段时间后过期。但我不确定如何在每个用户请求中检查此参数,然后调用 reset_session。重置会话后,我需要将用户重定向到登录页面。
非常感谢解决这两个问题的任何建议。
您可以将会话存储在 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
好吧,我很确定如果你运行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
他们处理其余的
我猜您正在使用自己的自定义身份验证方法。因此,对于场景 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
});