2010-12-07 5 views
2

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

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

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

ответ

0

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

2

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

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

    def reset_persistence_token 
    record.reset_persistence_token 
    end 
end 

Делая это, старую-сессию для входа пользователя в аннулируется.

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