Rails и Authlogic: Разрешить только один сеанс на пользователя? - PullRequest
2 голосов
/ 08 декабря 2010

Есть ли способ ограничить количество сеансов в приложении Ruby on Rails (я использую Authlogic для аутентификации)?

Я хотел бы разрешить только 1 сеанс для учетной записи пользователя. Когда этот же пользователь входит в систему на другом компьютере, предыдущий сеанс должен быть прерван / недействителен.

Я думал о сохранении данных сеанса в базе данных, а затем об их удалении при создании нового экземпляра сеанса, но, возможно, есть более простой способ? (опция конфигурации)

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Я только что натолкнулся на возможное решение, если вы сбросите токен презистенции, вы можете достичь желаемого поведения:

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
0 голосов
/ 08 декабря 2010

Я делаю именно то, о чем вы говорите, присваивайте идентификатор сеанса каждому сеансу Uniq, сохраняйте этот идентификатор в файле cookie и соответствующие данные сеанса в таблице.Работает хорошо.Моя цель состояла не в том, чтобы ограничить пользователей одним сеансом, а в том, чтобы сохранить переменные сеанса на стороне сервера, чтобы предотвратить манипулирование пользователями.

...