用户在Rails中注销后如何使所有会话无效?

时间:2016-07-02 10:03:53

标签: ruby-on-rails session-cookies

我是Rails的新手,我正在关注Michael Hartl的Rails教程,所以我的代码主要是从那里借来的。这是场景:

我使用Computer A登录我的网站。然后我使用Computer B使用相同的用户ID登录网站。当我使用Computer A注销网站时,Computer B仍然会登录并仍然可以执行操作。出于安全原因,我希望在Computer B注销后强制Computer A再次登录。是否有一种简单的方法可以在注销时使给定用户的所有会话无效?如果您有一些非常感谢的示例代码。

我还读到最好在注销时使用reset_session。但是,我在确定是否应该在退出用户之前或之后使用reset_session时遇到问题?

这是来自我的会话控制器:

  def destroy

    log_out if logged_in?

     # Reset session to prevent session fixation vulnerability
    reset_session

    flash[:info] = "You are now logged out"
    redirect_to root_url
  end

这是我的Sessions Helper:

  # Forgets a persistent session
  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

  # Logs out the current user
  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end

2 个答案:

答案 0 :(得分:1)

这是他们必须的工作。

会话依赖于browser.if登录到一台PC,然后您的会话保留在您当前工作的同一浏览器上。如果您使用另一台PC登录,那么您的浏览器会为您创建另一个会话。

您可以使用google和Facebook等知名网站尝试此方案。

请参阅以下链接。

What are sessions? How do they work?

如果你试图在单机中销毁所有会话,你可以试试。

rake db:sessions:clear

答案 1 :(得分:0)

您可以采用的一种方法是在用户模型上设置一个标志,让我们称之为activestatus,这将是数据库中的布尔列。当用户注销时,您将活动列设置为false。现在,在您的current_user方法中,在控制器中,您只需要检查用户是否为active,如果没有清除会话。

这里有一个我可以为此涂鸦的小片段:

class User
 # you should add an active or status column through a migration
 # enum status: {true => :active, false => :inactive} # largely personal preference for enums, you could define other helper methods without needing the enums
end

# x_controller
def log_out
  ...
  user.inactive!
  ...
end


def current_user
  if @current_user ||= User.active.find_by_id(session[:user_id])
   # the user is active continue
   @current_user
  else
   # the user is not active clear the session
   session.clear
  end
end

之前没有尝试过代码,但这是我认为你可以实现这一目标的方式。