Devise: rememberable means that last_sign_in_at is not updated by trackable
Ampliando soluzioni precedenti, il problema con loro sarebbe che se l'utente accede normalmente, saranno "segno due volte". Che imposterà last_sign_in_at
allo stesso valore (o quasi uguale) di current_sign_in_at
. Sul mio sito, io uso last_sign_in_at
per far sapere all'utente cosa è successo dall'ultima volta che hanno visitato il sito e, in quanto tale, ho bisogno che sia un po 'accurato. Inoltre, registra il numero di login +1.
Inoltre, ci sono persone (come me) che lasciano aperta una finestra del browser per giorni senza chiuderla (e quindi non cancellano mai il flag di sessione). Per scopi metrici, può essere utile se tale comportamento degli utenti a volte aggiorna il tempo current_sign_in_at
.
Le varianti qui sotto rimederanno a queste cose.
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
Tuttavia, quando provo quanto sopra, usando Devise 3.2.4, ottengo un nuovo account di accesso quando si auto-login per biscotto (Login-count +1 e current_sign_in_at
stato impostato). Quindi, mi rimane solo il problema di volere che il monitoraggio si aggiorni periodicamente anche per gli utenti che mantengono aperta la sessione.
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
fonte
2016-02-23 17:52:19
quando viene chiamato before_filter? Spero non su ogni richiesta e solo prima dell'autenticazione per la prima volta in quella sessione? Inoltre, domanda stupida, ma dove aggiungo before_filter? Ho provato ad aggiungerlo al modello utente di Devise e ho ottenuto il metodo non definito before_filter. –
Questo dovrebbe essere eseguito su ogni richiesta - era solo un passo di debug rapido/sporco per vedere se ciò avrebbe risolto prima di implementare una soluzione migliore. Dovresti essere in grado di aggiungerlo a qualsiasi controller, ApplicationController se lo vuoi globale. – RobH
Ciao Rob, questo è quello che ho cercato alla fine che a) controlla che un utente sia loggato prima di forzare un sign_in, e b) assicura che il metodo sign_in (forzato) venga eseguito solo una volta per sessione.(scusa il; invece delle interruzioni di riga, i commenti non consentono interruzioni di riga) 'before_filter proc {if user_signed_in? && session [: logged_signin]; sign_in (current_user,: force => true); session [: logged_signin] = true; end} ' –