Rails和Authlogic:每个用户只允许一个会话?

时间:2010-12-07 22:49:44

标签: ruby-on-rails session authentication authlogic

有没有办法限制Ruby on Rails应用程序中的会话数量(我使用Authlogic进行身份验证)?

我想每个用户帐户只允许1个会话。当同一用户登录另一台计算机时,上一个会话应该过期/无效。

我正在考虑将会话数据存储在数据库中,然后在创建新会话实例时删除它,但可能有更简单的方法吗? (配置选项)

2 个答案:

答案 0 :(得分:2)

我刚刚遇到了一个可能的解决方案,如果您重置presistence令牌,您可以实现预期的行为:

class UserSession < Authlogic::Session::Base
  before_create :reset_persistence_token

  def reset_persistence_token
    record.reset_persistence_token
  end
end

通过这样做,登录用户的旧会话无效。

之前我按照你的提到实现了它:将一个session_key字段添加到users表中,并确保在登录时为用户存储当前的session_id:

class UserSession < Authlogic::Session::Base
  after_save :set_session_key
  def set_session_key
    record.session_key = controller.session.session_id
  end
end

然后在通用控制器中执行类似这样的操作,以便在其他人使用同一帐户登录时踢出用户:

before_filter :check_for_simultaneous_login

def check_for_simultaneous_login
  # Prevent simultaneous logins
  if @current_user && @current_user.session_key != session[:session_id]
    flash[:notice] = t('simultaneous_logins_detected')
    current_user_session.destroy
    redirect_to login_url
  end
end

答案 1 :(得分:0)

我完全按照您的说法进行操作,为每个uniq会话分配会话ID,将该ID存储在cookie中,并将相关的会话数据存储在表中。效果很好。我的目标不是将用户限制为单个会话,而是保持会话变量服务器端以防止用户操作。