使用设计注销时如何清除当前会话?

时间:2014-07-01 23:17:50

标签: ruby-on-rails-4 devise

所以我的应用程序正在使用Devise来管理身份验证。我最近在应用程序中添加了一个注销按钮,它似乎可以很好地重定向到登录屏幕。但是今天我在登录界面上运行了一些测试,发现即使在使用注销程序后我仍然登录了应用程序。

在我的初始化程序中,我有:

config.sign_out_via = :delete

我的退出链接如下所示:

<%= link_to "Log out", destroy_user_session_path, :method => :delete %>

我检查了ApplicationController,看看是否需要登录用户:

class ApplicationController < ActionController::Base
   before_filter :require_login
   ...
   def after_sign_out_path_for(resource_or_scope)
       login_path           # displays login page
   end

   def require_login
       redirect_to login_url unless current_user && user_signed_in?
   end

由于某种原因,user_signed_in?即使单击注销链接,检查仍然返回true。所以我仍然可以回到应用程序而无需重新输入我的凭据。显然不应该这样。

更新:

以下是服务器日志的输出:

在2014-07-03 13:05:07 +1000开始为127.0.0.1删除“/ users / sign_out” 由Devise处理:: SessionsController#destroy作为HTML   参数:{“authenticity_token”=&gt;“Na06x5aAzq / XVhJKrxKEIoh / Bly53fIAq0KEQTG hmM =”}

无法验证CSRF令牌真实性

更新2:

我现在注意到,当我尝试使用不同的登录详细信息登录应用程序时,它无法正常工作。因为我没有被注销,所以看起来它正在跳过登录例程并将我重新导入。我知道这在以前是有效的,所以自从打破这个功能以来已经发生了变化。

1 个答案:

答案 0 :(得分:0)

好的,所以在花了几个小时试图解决这个问题后,我发现了两个问题。

第一个问题是ApplicationController.rb中的这一行:

protect_from_forgery with: :null_session

我之前添加了这个,以便在用户尝试注销两次时隐藏错误。但是,这隐藏了我遇到的问题。

实际问题是InvalidAuthenticityToken错误。它正在停止退出,并且(后面我发现)登录。

为了解决这个问题,我在ApplicationController.rb中添加了以下行(这可能不是正确的解决方案):

skip_before_filter :verify_authenticity_token

出于某种原因,我在应用程序的其他地方遇到过这个问题,说实话(我是铁杆新手)我不知道为什么这个错误突然开始导致我这么多头痛。