Rails / Authlogic - UserSession.destroy不会终止会话

时间:2010-12-17 21:10:18

标签: ruby-on-rails authlogic

我需要一些非常基本的帮助。我已经按照了关于让Rails 3和Authlogic一起工作的优秀教程。它是许多地方引用的相同的非常基本的身份验证shell。但我不能让登出功能起作用。我花了好几天尝试各种各样的事情。所以我需要帮助。也许它只是我没有正确理解的东西,但问题在于:

底线:@ user_session.destroy不会终止会话。

详细说明: 我正在开发一个Web服务,所以我只与.xml格式请求进行交互......我正在使用cURL进行测试。

除了我的主要问题,一切正常。我用Users播种数据库。

当我执行以下操作而没有先登录并且cookies.txt为空(或者是其他用户的cookie) - >

curl -v -H "Accept: text/xml" -X GET --cookie cookies.txt http://localhost:3000/user.xml 

我的请求被拒绝(没有会话)

当我使用此登录时 - >

curl -v -H "Accept: text/xml" -X POST -d 'user_session[email]=eric@xyz.com&user_session[password]=secret' --cookie-jar cookies.txt http://localhost:3000/user_session.xml

创建了一个新会话,然后我可以在我的心灵内容中进行先前的GET。一切都正常运行,使用其他用户cookie不起作用,使用没有cookie不起作用等。

但......当我退出时...这样做 - >

curl -v -H "Accept: text/xml" -X DELETE --cookie cookies.txt http://localhost:3000/user_session.xml

调用UserSessionsController#destroy动作

def destroy
  @user_session = UserSession.find
  @user_session.destroy

respond_to do |format|
  format.html { redirect_to(:users, :notice => 'Goodbye!') }
  format.xml  { head :ok }
end
end

和动作中的行 - @user_session = UserSession.find和 @ user_session.destroy被执行。在destroy之后没有错误和测试@user_session = UserSession.find正如预期那样生成nil

HOWEVER ...在下一个GET请求中,如果在请求中传递了现在应该过期的相同cookie,则会发生该特定用户id的相同数据库查找并传递信息 - 就好像会话仍然存在一样! !

我知道这是基本的东西,但为了完整性,这里是我的ApplicationController:

class ApplicationController < ActionController::Base
#protect_from_forgery
helper_method :current_user_session, :current_user

private

def current_user_session
  return @current_user_session if defined?(@current_user_session)
  @current_user_session = UserSession.find
end

def current_user
 return @current_user if defined?(@current_user)
 @current_user = current_user_session && current_user_session.record
end

def require_user
 unless current_user
  respond_to do |format|
    format.xml  { head :unauthorized }
  end
  return false
 end
end

def require_no_user
 if current_user
  respond_to do |format|
   format.xml  { head :bad_request }
  end
 return false
end
end

@user_session = current_user_session中的UserSession.find - 生成已注销的用户并将继续这样做...如果在提供的登录时创建的原始cookie将永远存在。

无论我尝试什么,我都无法退休。当我看到缓存命中时,我甚至钻研了关闭ActiveRecord缓存。缓存已关闭,没有任何变化。我认为这是对我的理解的严重错误或Authlogic的一些我不理解或不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

根据Zabba的优秀答案,我提出了在注销后清理会话记录的解决方案,并且(在创建之后的预定时间之后,我想要两者)。 Zabba的答案很好,我只是想在Authlogic中整合一个答案。

解决方案非常简单易行。在我找到以下两个资源之前,我不清楚如何做到这一点。我想我之前没有找到这些,因为我不知道我在找什么。

为了在注销时清除会话 - 我使用了这个答案并且效果很好。

Authlogic and multiple sessions for the same user

对于超时,我在这里使用了第二个答案 -

Ruby on rails - Authlogic : periodically check if user session is valid

一切似乎都很好。

答案 1 :(得分:1)

如果您没有找到解决方法 - 会话记录永远不会被清除。解决此问题的一种方法是使用cron作业定期清理会话。

以下是我发现有用的资源:Sessions and cookies in Ruby on Rails

还可以安装一个插件,以便更智能地管理用户会话(包括自动清理功能):Limited Sessions