Вы можете отслеживать сеанс конкретного пользователя, сохраняя уникальный токен, специфичный для этого пользователя, в базе данных.
Создайте миграцию, чтобы добавить поле для хранения токена.Я предполагаю, что разработанная модель - Пользователь.
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!
Надеюсь, это поможет ..