【问题标题】:Default Devise::SessionsController 'DELETE /users/sign_out' not signing out users默认 Devise::SessionsController 'DELETE /users/sign_out' 不退出用户
【发布时间】:2019-03-06 02:16:15
【问题描述】:

我有一个带有注销链接的应用程序:<%= link_to('Logout', destroy_user_session_path, method: :delete) %>

单击该链接后,我的开发服务器日志中会显示以下内容:

Started DELETE "/users/sign_out" for 172.30.0.1 at 2019-03-06 14:52:49 +1300
Processing by Users::SessionsController#destroy as HTML
  Parameters: {"authenticity_token"=>"JLLEb2GSjGuYx+oBhsAkB0jcP0qZCJEUBvuH5VDmCS9Xbwe/hw085gumBPqJmWTtjyFeW1Io81n32NGxDuKjyQ=="}
  User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 4 ORDER BY `users`.`id` ASC LIMIT 1
   (0.2ms)  BEGIN
   (0.4ms)  COMMIT
Redirected to https://webdev.test:3000/
Completed 302 Found in 28ms (ActiveRecord: 0.9ms) 

然后根页面再次加载,但用户尚未退出。

我在 Chrome 中以隐身模式打开了一个选项卡,并尝试登录和注销,它工作正常,所以它似乎是我的正常模式浏览器特有的东西。我已经尝试重新启动浏览器,但没有任何影响。

我在 Devise 中登录的用户帐户在每次执行此操作时都不会增加其登录计数,updated_at 时间戳也不会改变。

然后我将byebug 放入我的根页面控制器方法中并运行以下命令:

   1: class HomeController < ApplicationController
   2:   def index
   3:     byebug
=> 4:     # Omitted for brevity, nothing which touches the current_user object
   5:   end
   6: end
(byebug) Devise.sign_out_all_scopes
true
(byebug) sign_out
   (0.8ms)  BEGIN
   (0.4ms)  COMMIT
true
(byebug) continue

然后确认,用户仍然没有退出。

重新启动 Rails 应用程序并再次尝试上述所有操作都会导致相同的结果,但我仍然无法退出该用户。

以前有没有人看过这个并且对卡住的问题以及如何退出有任何想法?

编辑

应评论者的要求,与sign_out相关的路线:

$ rails routes | grep sign_out
          destroy_user_session DELETE   /users/sign_out(.:format)                                   users/sessions#destroy
$ 

rails routes | grep destroy_user_session 的输出也与上述相同,因此它表明没有将请求定向到不同控制器操作的命名路由。

还有app/controllers/users/sessions_controller.rb的控制器(它只覆盖create方法,而不是destroy方法)

class Users::SessionsController < Devise::SessionsController
  def create
    # Omitted for brevity
  end
end

【问题讨论】:

  • 您可以运行命令rails routes 打印出写入并仅显示与用户注销相关的路由吗?我认为您正在使用另一个控制器请分享您覆盖它的控制器的销毁方法。正如我想检查的那样,它显示的是 Users::SessionsController#destroy 而不是 Devise::SessionControl#destroy
  • 我没有覆盖 SessionsController 的 destroy 方法,只有 create 方法。将很快添加路线。

标签: ruby-on-rails devise


【解决方案1】:

我尝试并创建了用户控制器来检查并看起来一切都很好。我只有一个奇怪的问题,我不确定它为什么会改变。它是关于 SQL 查询的。您的回复正在收到以下查询。

SELECT  `users`.* FROM `users` WHERE `users`.`id` = 4 ORDER BY `users`.`id` ASC LIMIT 1

为什么它有 4 个 id 作为硬编码,通常它应该像下面这样准备语句

SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 4], ["LIMIT", 1]]

因此,为了进行调查,我将尝试使用不同的用户来查看登录和注销,并检查 ID 是否正在更改。如果它没有改变,那么我将调查这个 ID 的来源以及为什么它是硬编码的。

【讨论】:

  • 该 SQL 查询直接取自 Puma 日志,因此是在字符串插值发生之后。
  • 您在不删除会话时遇到问题,通常 ruby​​ on rails 使用您的应用名称创建会话,其中包含身份验证信息。显然,当您处于认知模式时,它工作正常,这意味着该应用程序正常。您可以使用开发人员工具检查您的会话,首先以正常模式登录并登录,然后在文本编辑器上复制会话详细信息,现在退出并查看是否有任何更改。因为如果没有给出错误的代码进行调查是很复杂的。也可以通过使用 cookie 工具删除 ruby​​ on rails 应用程序的 cookie 来尝试浏览器,而不是尝试。
猜你喜欢
  • 2017-02-13
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多