我正在使用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,但它不接受它们。
有谁能告诉我如何清除被破坏的用户的会话?感谢
答案 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控制台中删除了没有会话的用户。