Rails 5: sign_out(:user) 负载均衡应用

Rails 5: sign_out(:user) on load balanced application

我注意到一个奇怪的行为。我试图在 SessionsController 中的自定义操作中注销用户,然后在 JS 中将用户重定向到登录页面。我的应用程序部署在负载均衡器后面的 AWS 上。

下面是相关的会话控制器和javascript代码。

  def inactivity
    user_signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(:user))
    flash.now[:alert] = 'Logged out due to inactivity.'
    flash.keep(:alert)
    if user_signed_out
      head :ok
    else
      raise "User could not be logged out."
    end
  end
Session.inactivity().then(function() {
Turbolinks.visit('/users/sign_in');
})

我看到在某些情况下,用户没有重定向到签名页面,而是登录并重定向到主页,尽管在 inactive 方法中 sign_out(user).

我检查了日志,发现在这种情况下 sign_out 由一台服务器处理,重定向到 sign_in 的请求由另一台服务器处理。

会不会是一台服务器不知道用户已注销,因此将用户重定向到主页?

这个问题的可能解决方案是什么?

谢谢。

如果您使用了错误的会话存储,服务器将不知道来自其他 backend-servers 的会话。对我来说,您似乎应该使用 ActiveRecordStore。然后会话数据存储在数据库中。为了 更多信息请参阅 https://guides.rubyonrails.org/action_controller_overview.html#sessionDoes Ruby on Rails ActiveRecordStore work with load balancing across servers?