如果用户忘记注销并关闭浏览器,如何删除 Rails 中以前的会话?

Posted

技术标签:

【中文标题】如果用户忘记注销并关闭浏览器,如何删除 Rails 中以前的会话?【英文标题】:How to remove previous sessions in Rails, if user forget to logout and close the browser? 【发布时间】:2011-03-07 05:32:43 【问题描述】:

我将所有会话信息存储在数据库中。用户可以登录系统做某事。有一些限制区域需要用户登录。如果用户在登录前尝试到达这些区域,系统会将他们重定向到登录页面。

有时用户可能会在不注销的情况下关闭浏览器。如果发生这种情况,下次他尝试登录时,即使用户输入了正确的用户名和密码,系统也无法识别新生成的会话。然后系统将强制用户再次登录。

有人知道如何解决这个问题吗?在加载登录页面之前,我尝试使用reset_session 重置会话。问题无法解决。

会话控制器

  def new
  end

  def create
    session[:current_account] = Account.authenticate(params[:email], params[:password])
    if session[:current_account]
      redirect_to :controller => "xxxxx", :action => "index"
    else
      flash[:notice] = "Please try again."
      render :action => 'new'
    end
  end

帐户模型

  def self.authenticate(email, pass)
    account = find_by_email(email)
    account && account.authenticated?(pass) ? account : nil
  end

  def authenticated?(pass)
    encrypted_password == Account.encrypt(pass,salt)
  end

Xxxxx 控制器

  before_filter :permission_handling

  def index
  end

应用程序控制器

  def permission_handling
    unless logged_in?
      forced_login
    end
  end

  def logged_in?
    session[:current_account].is_a?(Account)
  end

  def forced_login
    flash[:notice] = "You haven't login yet!"
    redirect_to ( :controller => "sessions", :action => "new" )
  end

谢谢大家。 :)

【问题讨论】:

【参考方案1】:

您似乎在会话中存储了一个 Account 对象。不建议这样做:您应该只存储简单的值,例如会话中的帐户 ID。

Model.authenticate 更改为返回account.id,并通过从数据库中加载帐户而不是将其保留在会话中来检查logged_in

我不确定这是否完全解决了问题,但它可能很重要。

【讨论】:

谢谢哥们。我会试试看。 :)

以上是关于如果用户忘记注销并关闭浏览器,如何删除 Rails 中以前的会话?的主要内容,如果未能解决你的问题,请参考以下文章

ipad忘记icloud密码如何注销(ipad忘记密码怎么注销icloud账户)

当用户直接关闭浏览器时如何跟踪注销活动

Rails 如何知道何时从 `sessions` 表中删除记录?

关闭浏览器时如何删除用于注销的 codeigniter 会话?

更改密码或关闭标签后注销用户

如何在关闭浏览器时从数据库中删除数据