销毁用户后清除会话

时间:2013-02-15 21:53:02

标签: ruby-on-rails

我正在使用Chrome中的管理员用户和其他浏览器中的普通用户。在我作为管理员销毁其中一个普通用户之后,我尝试在被破坏的用户正在使用的浏览器中重新打开该应用程序。但是,我收到此错误消息

Couldn't find Twitteruser with id=2

因此,在用户被销毁后,会话将继续存在于浏览器中

会话就是这样创建的

 def create
  twitteruser = Twitteruser.from_omniauth(env["omniauth.auth"])
  session[:twitteruser_id] = twitteruser.id
  redirect_to twitterquestions_url, notice: "Signed in!"
end

在application_controller中,当前用户就像这样创建了

   def current_user
         @current_user ||= Twitteruser.find(session[:twitteruser_id]) if    session[:twitteruser_id]
  end

这是破坏行动

 def destroy
    Twitteruser.find(params[:id]).destroy
    flash[:success] = "User destroyed."
    redirect_to users_url
 end

基于我发现的其他SO答案,我试图以两种不同的方式重置会话,但它们都重置了管理员用户的会话,而不是被销毁的用户

 def destroy
    Twitteruser.find(params[:id]).destroy
    #1. session[:twitteruser_id] = nil destroys my own session, not deleted users
    #2. reset_session  #reset admin's session
    flash[:success] = "User destroyed."
    redirect_to twitterusers_url
 end

我也尝试将参数传递给reset_session,但它不接受它们。

有谁能告诉我如何清除被破坏的用户的会话?感谢

1 个答案:

答案 0 :(得分:4)

这取决于您用于支持会话的内容。如果会话在Cookie中,则管理员无法使用它,因为没有任何服务器端可以使用。无论如何,弄乱别人的会话可能是不可能的,因为你不会知道会话ID。

您要做的是捕获由find引发的ActiveRecord::RecordNotFound或使用将返回nil的find_by_id。当用户尝试使用引用已删除用户的会话访问该站点时,您可以终止该会话。

def current_user
  @current_user ||= Twitteruser.find(session[:twitteruser_id]) if session[:twitteruser_id]
rescue ActiveRecord::RecordNotFound
  session[:twitteruser_id] = nil # or reset_session
end

def current_user
  @current_user ||= fetch_user(session[:twitteruser_id])
end

def fetch_user(id)
  Twitteruser.find_by_id(id) || reset_session unless id.nil?
end

无论Twitteruser如何被删除,这都将有效。例如,假设您从rails控制台中删除了没有会话的用户。