10

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

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

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

那么这是由于重新播种导致的问题还是我应该检查其他内容?我看到每次运行擦除/种子操作时加密密码都会更改,这是否与用户会话丢失有关?

4

3 回答 3

8

您不应该在部署期间清除数据库。想象一下,您的应用程序正在运行并且您有数百名用户。现在您对代码进行一些更改并进行部署。POOF你所有的数据和用户都不见了!当然这不是你想要的。

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

  • 您是否为具有相同 ID 的用户播种?如果重新播种时用户ID发生变化,将导致用户退出

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

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

最终,清除数据库是您的用户退出的唯一原因,这是一种不好的做法。所以最重要的要修复的是不要在部署期间擦除数据

于 2013-06-08T16:38:58.837 回答
4

此行为的原因如下:

每当一些用户更改他的密码时,自动设计退出他。

因此,基本上通过重新播种数据,重新计算密码(即使密码相同,新加密密码与旧密码不同)。因此,该设计将自动注销用户,因为似乎密码已更改(基于不同的 encrypted_pa​​ssword 字段)。

我设法绕过了这种行为,特别是在 seed.rb 文件中设置了 encrypted_pa​​ssword 并绕过了验证。

于 2013-06-12T18:34:28.857 回答
2

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

如果您生成新用户,旧用户将失去他们的会话。

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

于 2013-06-11T18:36:30.480 回答