所以我的应用程序正在使用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:
我现在注意到,当我尝试使用不同的登录详细信息登录应用程序时,它无法正常工作。因为我没有被注销,所以看起来它正在跳过登录例程并将我重新导入。我知道这在以前是有效的,所以自从打破这个功能以来已经发生了变化。
答案 0 :(得分:0)
好的,所以在花了几个小时试图解决这个问题后,我发现了两个问题。
第一个问题是ApplicationController.rb中的这一行:
protect_from_forgery with: :null_session
我之前添加了这个,以便在用户尝试注销两次时隐藏错误。但是,这隐藏了我遇到的问题。
实际问题是InvalidAuthenticityToken错误。它正在停止退出,并且(后面我发现)登录。
为了解决这个问题,我在ApplicationController.rb中添加了以下行(这可能不是正确的解决方案):
skip_before_filter :verify_authenticity_token
出于某种原因,我在应用程序的其他地方遇到过这个问题,说实话(我是铁杆新手)我不知道为什么这个错误突然开始导致我这么多头痛。