【问题标题】:clearing session after destroy a user销毁用户后清除会话
【发布时间】:2013-02-15 21:53:01
【问题描述】:

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

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

【问题讨论】:

  • 看来你只能是用户并且你(用户)即将清除 Twitteruser 的会话。那么当你做session[:twitteruser_id] = nil来清除你自己的会话时,怎么可能呢?
  • 抱歉,OP 中的错误。没有用户,只有 Twitteruser。我现在修好了。这不是会话问题的原因。
  • 应用程序如何知道您是Admin?这是注销操作还是 Twitteruser 删除?
  • 应用程序知道我是管理员,因为每个用户都有一个管理员字段。删除用户链接仅对管理员布尔值设置为 true 的用户可见。因此,在 Chrome 浏览器中,我以管理员布尔值设置为 true 的用户身份登录,并从用户列表中删除了另一个用户的帐户。

标签: ruby-on-rails


【解决方案1】:

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

您想要做的是捕获 find 抛出的 ActiveRecord::RecordNotFound 或使用 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 控制台中删除了用户。

【讨论】:

  • 实际上,我正在使用 MyApp::Application.config.session_store :active_record_store 。您是否介意更新您的答案以包含此方案的说明(但请保留已提供的信息,因为我想从中学习)。感谢您能提供更多帮助。
  • 我附加了第一段。无论会话存储如何,相同的答案都适用。
  • 非常感谢。在您的第一个示例中,会话不应该设置为 nil 吗?否则为什么它是reset_session的替代品
  • 实际上,您的第二个示例(我没有尝试过第一个示例)并没有达到预期的效果。作为使用 Chrome 浏览器的管理员,我销毁了用户。在 Firefox 中,我刷新浏览器并且已登录的用户不再登录,因为它已被销毁。但是,如果我单击使用 Twitter 登录,被破坏的用户可以重新登录,(然后也会重新出现在用户列表中,供管理员在 Chrome 浏览器中销毁)。
  • 当我说被破坏的用户可以重新登录时,我的意思是他可以做到这一点,而无需再次向 Twitter 授予权限。您的第一个解决方案(我刚刚测试过)也会发生同样的事情
猜你喜欢
  • 2019-01-19
  • 2015-03-03
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多