Devise - Отменить пользовательский сеанс, если один и тот же пользователь входит в систему с другого браузера / компьютера - PullRequest
5 голосов
/ 09 сентября 2011

У меня есть сценарий, в котором мне нужно запретить пользователям иметь только один активный сеанс за раз.Мое приложение rails3 и использует устройство для аутентификации.Я заинтересован в сохранении активности только последней пользовательской сессии.то есть, если пользователь входит в систему, когда существует другой сеанс, активный для того же имени пользователя, я хочу деактивировать более старый сеанс и разрешить последний.Есть ли способ, чтобы разработать пользовательские сессии и сделать их недействительными?

Ответы [ 2 ]

15 голосов
/ 09 сентября 2011

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

Создайте миграцию, чтобы добавить поле для хранения токена.Я предполагаю, что разработанная модель - Пользователь.

class AddSignInTokenToUsers < ActiveRecord::Migration
  def change
    add_column :users, :current_sign_in_token, :string
  end
end

Добавьте следующий код в application_controller.rb

class ApplicationController < ActionController::Base
  before_filter :invalidate_simultaneous_user_session, :unless => Proc.new {|c| c.controller_name == 'sessions' and c.action_name == 'create' }

  def invalidate_simultaneous_user_session
    sign_out_and_redirect(current_user) if current_user && session[:sign_in_token] != current_user.current_sign_in_token
  end

  def sign_in(resource_or_scope, *args)
    super
    token = Devise.friendly_token
    current_user.update_attribute :current_sign_in_token, token
    session[:sign_in_token] = token
  end
end

sign_in(resource_or_scope, *args) - ловушка устройства, которая будет вызываться каждый раз, когда пользователь регистрируетсяin.

invalidate_simultaneous_user_session выйдет из системы текущего пользователя, если в него войдет другой экземпляр текущего пользователя. Это гарантирует, что в любой момент времени для пользователя активен только один сеанс.

* 1015Фильтр *invalidate_simultaneous_user_session должен быть пропущен для действия входа пользователя в систему для обновления токена нового пользователя.Я не доволен использованием Proc для пропуска фильтра на основе имени контроллера и действия.Если вы уже переопределили sessions_controller устройства, включите skip_before_filter :check_simultaneous_user_session внутри этого контроллера, и вы можете избавиться от Proc!

Надеюсь, это поможет ..

2 голосов
/ 28 января 2014

Для обновленного устройства для рельсов 4, Вы можете изменить код в соответствии с этим

http://pastebin.com/p6mvC8T3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...