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