Я только что натолкнулся на возможное решение, если вы сбросите токен презистенции, вы можете достичь желаемого поведения:
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