我需要一些非常基本的帮助。我已经按照了关于让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的一些我不理解或不起作用。
有什么想法吗?
答案 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