Devise: запоминаемый означает, что last_sign_in_at не обновляется отслеживаемым - PullRequest
10 голосов
/ 09 января 2012

Я использую Devise и полагаюсь на last_sign_in_at пользовательской модели, чтобы выяснить, не вернулись ли мои клиенты в течение X дней.Однако недавно я обнаружил, что last_sign_in_at обновляется только при фактическом событии входа в форму, а не при автоматическом входе пользователя из-за включения в него запоминаемого.

Если вы хотите убедиться, что last_sign_in_at обновленкаждый раз, когда пользователь входит в систему (новый сеанс браузера), независимо от того, использовали ли они форму для входа в систему или были автоматически зарегистрированы с помощью запоминаемого файла cookie, как мне поступить так, совместимым с Devise?

Ответы [ 5 ]

15 голосов
/ 18 августа 2012

Принимая решение Мэтью, я думаю, что код должен быть следующим (обратите внимание, что оператор not перед сеансом [: logged_signin]):

before_filter :update_last_sign_in_at

protected

def update_last_sign_in_at
  if user_signed_in? && !session[:logged_signin]
    sign_in(current_user, :force => true)
    session[:logged_signin] = true
  end
end
6 голосов
/ 10 января 2012

Отслеживаемый хук взят из Хука начальника after_set_user - что вы можете сделать, чтобы легко исправить это, установив before_filter для вызова sign_in .

Это может быть оптимизировано, но проверьте, чтобы использовать

before_filter proc{ sign_in(current_user, :force => true) }

обновляет отметку времени last_signed_in_at.

2 голосов
/ 23 февраля 2016

Devise: запоминаемое означает, что last_sign_in_at не обновляется отслеживаемым

Если развернуть предыдущие решения, проблема с ними будет заключаться в том, что если пользователь войдет в систему в обычном режиме, он "войдет в систему".дважды".Что установит last_sign_in_at в то же (или почти то же самое) значение, что и current_sign_in_at.На моем сайте я использую last_sign_in_at, чтобы сообщить пользователю, что произошло с момента его последнего посещения, и поэтому мне нужно, чтобы он был несколько точным.Кроме того, он регистрирует +1 логина.

Также есть люди (как я), которые оставляют окно браузера открытым на несколько дней, не закрывая его (и, следовательно, никогда не сбрасывая флаг сеанса).Для метрических целей и т. Д. Может быть полезно, если такое поведение пользователя иногда обновляет время current_sign_in_at.

Следующие варианты исправят это.

class ApplicationController < ActionController::Base
  before_filter :update_sign_in_at_periodically
  UPDATE_LOGIN_PERIOD = 10.hours

  protected

  def update_sign_in_at_periodically
    if !session[:last_login_update_at] or session[:last_login_update_at] < UPDATE_LOGIN_PERIOD.ago
      session[:last_login_update_at] = Time.now
      sign_in(current_user, :force => true) if user_signed_in?
    end
  end
end

Однако, когда я пытаюсьвыше, используя Devise 3.2.4, я получаю новый логин при автоматическом входе в систему с помощью cookie (число логинов +1 и current_sign_in_at установлено).Таким образом, у меня остался только вопрос о необходимости периодически обновлять отслеживание даже для пользователей, которые поддерживают сеанс открытым.

class ApplicationController < ActionController::Base
  before_filter :update_sign_in_at_periodically
  UPDATE_LOGIN_PERIOD = 10.hours 

  protected 

  def update_sign_in_at_periodically
    # use session cookie to avoid hammering the database
    if !session[:last_login_update_at] or session[:last_login_update_at] < UPDATE_LOGIN_PERIOD.ago
      session[:last_login_update_at] = Time.now
      if user_signed_in? and current_user.current_sign_in_at < 1.minute.ago # prevents double logins
        sign_in(current_user, :force => true)
      end
    end
  end
end
0 голосов
/ 24 мая 2018

На application_controller вы можете установить before_action, который проверяет, больше ли current_sign_in_at текущего пользователя, чем X назад. Если это так, используйте sign_in(current_user, force: true), который обновляет current_sign_in_at.

before_action :update_last_sign_in_at

def update_last_sign_in_at
   return unless user_signed_in? && current_user.current_sign_in_at < 12.hours.ago
   sign_in(current_user, force: true)
end

Я использую его для обнаружения неактивных пользователей (не вошедших в систему в течение 6 месяцев) и удаления их. # GDPR

0 голосов
/ 23 января 2015

AFAIK вы также можете использовать update_tracked_fields! на этой current_user модели.

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