Как я могу узнать, зарегистрирован ли данный пользователь Devise прямо сейчас? - PullRequest
4 голосов
/ 12 января 2012

В приложении Rails, которое использует Devise, есть ли способ узнать, зарегистрирован ли определенный пользователь в прямо сейчас ?

Я знаю о представлениипомощник, user_signed_in?.То, что я ищу, больше похоже на:

User.all.each do |user|
  puts user.signed_in?
end

Я вижу, что Devise добавил столбец current_sign_in_at к users.Но это не устанавливается на NULL, когда пользователь выходит из системы, поэтому я не могу проверить это.

Как я могу проверить, вошел ли пользователь в систему в данный момент?

Ответы [ 4 ]

6 голосов
/ 03 марта 2012

Вы можете добавить before_filter в ApplicationController, чтобы установить текущую дату / время в поле last_request_at в вашей таблице пользователей, которое вы должны будете сначала добавить с помощью миграции. , В методе, вызываемом из before_filter, вы, конечно же, хотите убедиться, что пользователь прошел аутентификацию первым. И вы можете захотеть исключить фильтр для действий, не требующих аутентификации.

Затем, если вы включили модуль Timeoutable в свою модель User, вы можете увидеть, является ли сеанс пользователя текущим или нет, сделав такой вызов:

user.timedout?(user.last_request_at)

Метод timedout? (Last_access) , определенный в модуле Timeoutable, будет сравнивать время ожидания сеанса Devise с временем / датой последнего запроса.

В качестве примечания вы можете обновить last_request_at только в том случае, если значение last_request_at больше минуты назад (или любого выбранного вами временного интервала). В противном случае, если ваша страница выполняет много вызовов контроллера, как моя делает через AJAX, в одном запросе будет много ненужных обновлений БД.

4 голосов
/ 12 января 2012

Вы пытаетесь отследить, вошел ли пользователь в систему и активен ли сеанс, или пользователь сейчас находится на сайте?

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

Warden::Manager.after_authentication do |user, auth, opts|
    if user.last_action <= 5.minutes.ago.utc
        user.last_action = Time.now
        user.save
    end
end

Если вы хотите посмотреть, если у вас есть активный сезон и вы явно не вышли из него, это будет что-то вроде:

Warden::Manager.before_logout do |user, auth, opts|
    user.current_sign_in_at = nil
    user.save
end
1 голос
/ 26 февраля 2013

Добавьте активный флаг к вашей модели пользователя (устройства). В контроллере приложения под хуком after_sign_in_path_for(resource) установите для активного флага значение true (происходит, когда пользователь успешно создает новый сеанс).

для пользователя, вышедшего из системы, переопределите метод destroy в devise session_controller и установите для активного флага значение false, затем вызовите super.

Теперь вы можете позвонить user.active? на любого пользователя.

0 голосов
/ 13 января 2012

Devise поставляется с методом current_user, который возвращает текущего пользователя в контроллерах, моделях и представлениях.

...