2

我正在与 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 但它不接受它们。

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

4

1 回答 1

4

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

你想要做的是要么捕获ActiveRecord::RecordNotFoundfind 抛出的,要么使用 find_by_id 返回 nil。当用户尝试使用引用已删除用户的会话访问站点时,您可以终止该会话。

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

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

于 2013-02-15T22:11:37.083 回答