部署后Devise失去会话

时间:2013-06-06 15:18:50

标签: ruby-on-rails session devise session-timeout

我有一个rails 4应用程序,我正在使用设计进行身份验证,它运行良好。我唯一的问题是,在我将其部署到服务器并且用户必须再次登录后,它会丢失用户的会话。

如果我只是重新启动nginx / passenger(我用于我的应用程序),它就不会丢失它。 当我部署我的应用程序时,我正在失去它。对于部署,我也会自动清除所有数据库,我的部署脚本运行种子文件,它也会生成用户。

我们目前正在开发应用程序,所以这种行为现在是可以接受的,但是在 未来当应用程序准备就绪时,我们不会这样做(当然!)。

因为重播还是应该检查别的东西,这是一个问题吗?我看到每次运行wipe out / seed操作时加密的密码都会改变,这是否与丢失用户会话有关?

3 个答案:

答案 0 :(得分:8)

在部署期间,切勿彻底清除数据库。想象一下,您的应用程序正在运行,并且您拥有数百个用户。现在,您在代码中进行了一些更改并进行部署。 POOF 您的所有数据和用户都已消失!当然这不是你想要的。

其次,当您清除数据库时用户退出可能是由于以下原因之一:

  • 您是否为具有相同ID的用户播种?如果重新播种时用户ID发生更改,则会导致用户注销

  • 您是使用config.session_store :active_record_store而不是使用Cookie在数据库中存储会话?在这种情况下,擦除数据库将删除会话表并注销所有用户

  • Rails 4默认使用加密的cookie存储。在重新部署时确保您没有更改应用程序的config.secret_token,以防它从数据库加载

最终,清除数据库是用户退出登录的唯一原因,这是一种不好的做法。因此,最重要的是要解决在部署期间不要擦除数据

答案 1 :(得分:3)

此行为的原因如下:

每次有些用户更改密码时,都会自动设定签名。

因此,基本上通过重新种植数据,重新计算密码(即使密码相同,新加密密码也不同于旧密码)。因此设计将自动签署用户,因为它似乎更改了密码(基于不同的encrypted_pa​​ssword字段)。

我设法绕过了这种行为,专门设置了seeds.rb文件中的encrypted_pa​​ssword并绕过了验证。

答案 2 :(得分:2)

  

如果我只是重新启动nginx / passenger(我正在使用我的   app)它不会丢失它。当我部署我的应用程序时,我正在失去它。   对于部署我也会自动清除所有数据库和我的   部署脚本运行种子文件,它也生成它   用户。

如果您生成新用户,则旧用户将丢失其会话。

这是因为新用户的价值会有所不同。例如,它们可能没有记忆标记集,或者如果session_id使用user.created_atuser.token_generated_at的值,则每次删除并重新创建数据库时它们都会有所不同。