Ruby on rails 设计过期过快的会话(小时,而不是天)

Ruby on rails 设计过期过快的会话(小时,而不是天),ruby-on-rails,ruby,authentication,devise,ruby-on-rails-6,Ruby On Rails,Ruby,Authentication,Devise,Ruby On Rails 6,我把它从一个地方移走了,因为我还不知道它实际上是一个bug。我希望有人能帮助我理解为什么我的设计会话超时如此之快 环境 Ruby 2.7.2 轨道6.1 设计4.7.3 当前行为 我的目标是在要求用户再次登录之前将会话保持大约30天。使用stock Desive,不可邀请,我在我的桌面浏览器上看到了正确持久的会话时间,但在移动设备上看到了短会话(在几天内到期,有时几小时)。我意识到也许我需要使用:timeoutable 我根据用户模型安装了:timeoutable,在designe.rb中启用并

我把它从一个地方移走了,因为我还不知道它实际上是一个bug。我希望有人能帮助我理解为什么我的设计会话超时如此之快

环境 Ruby 2.7.2 轨道6.1 设计4.7.3

当前行为 我的目标是在要求用户再次登录之前将会话保持大约30天。使用stock Desive,不可邀请,我在我的桌面浏览器上看到了正确持久的会话时间,但在移动设备上看到了短会话(在几天内到期,有时几小时)。我意识到也许我需要使用
:timeoutable

我根据用户模型安装了
:timeoutable
,在designe.rb中启用并设置了
中的
配置.timeout\u,时间为29.5天。除了现在配置了
:timeoutable
而不是更长的29天会话外,所有浏览器会话都会在大约一两个小时后关闭

预期行为 会话应持续29.5天,然后要求用户再次登录

我觉得我错过了一些明显的东西,但我找不到。
:timeoutable
不是实现这一点的正确方法吗

更新: 将我的应用程序从子域移动到根域后,此问题自行解决。这并不是什么真正的答案,但我想在这里添加它作为上下文。除此之外,我认为下一个最好的答案是调整rails本地cookie存储


无论如何,我仍然不相信timeoutable是否正常工作。

您只需将其添加到您的用户模型中即可:

devise :timeoutable, timeout_in: 29.days
中的
timeout\u定义了用户可以不活动以再次请求凭据的时间量。也就是说,用户会话只有在29天内没有与其应用程序交互时才会过期

请记住,要使用
:timeoutable
,不需要额外的列,这不适用于
记住我


更多细节:

会话完全令人困惑,因为我们对许多不同的事物使用相同的术语

第一个是Rails提供的低级
ActionDispatch::Session
机制。这包括一组中间件,它们将会话标识符(标识连接到应用程序accross请求的客户端)与会话存储链接起来。这实际上可以跨请求持久化任何类型的简单可序列化对象,虽然它最常用于身份验证,但它还可以执行其他功能,如flash消息

默认会话存储是迄今为止最快的,但也有几个选项可用于在服务器上存储会话数据。您可以通过以下方式设置会话存储cookie的到期时间:

Rails.application.config.session_store :cookie_store, expire_after: 30.days
然后就是所谓的身份验证会话,它实际上只是将声明(id)存储在存储库中,这样用户就不必在每个请求中提供凭据(电子邮件、密码)。在设计中,所有这些东西都由典狱长gem处理。当您登录时,Warden会将该用户id填充到会话存储中,并在您注销时将其删除。这会在使用特定客户端时让您登录/注销。默认情况下,这里没有实际超时-它持续的时间与会话存储cookie的时间一样长


这就是超时模块的作用。它与id一起存储额外的时间戳,如果时间戳已过期,Warden将拒绝存储在会话中的用户id并将其删除。并不是说如果cookie在此之前确实过期了,那么整个过程就没有意义了。

谢谢您的帮助,但在我阅读本文时,我看不出是否在我已经概述的内容之外添加了任何细节,除了移动定义了
超时时间的位置。我怀疑改变这个定义会改变行为。我做了一些测试,显然designe.rb中定义的
中的
超时值没有你自己的模型中定义的那么好,如我举例所示。我可以确认这没有什么区别,会话仍然在4小时内过期,而不是指定的29.5天。这是一个信息性的过程,我还没有尝试扩展rails
session\u store
,但可以。我不明白那个看守和
:timeoutable
是什么“正确”方法。我仍然不明白为什么这种配置在移动设备上不起作用。我只能假设这与safari在iOS中快速过期会话的方式有冲突,但这会使这成为一个bug而不是一个配置问题。safari确实有一些反跟踪功能,如ITP,它会导致cookie快速过期-但我不太确定到底是什么问题。