Devise: rememberable means that last_sign_in_at is not updated by trackable
Ampliando soluciones anteriores, el problema con ellos sería que si el usuario inicia sesión normalmente, van a "firmar en dos ocasiones". Que establecerá last_sign_in_at
en el mismo valor (o casi el mismo) que current_sign_in_at
. En mi sitio, uso last_sign_in_at
para que el usuario sepa qué pasó desde la última vez que visitó el sitio y, como tal, necesito que sea un tanto preciso. Además, registra +1 inicio de sesión.
Además, hay personas (como yo) que dejan una ventana del navegador abierta durante días sin cerrarla (y por lo tanto nunca borran la marca de la sesión). Para fines métricos, etc., puede ser útil si dicho comportamiento del usuario a veces actualiza el tiempo current_sign_in_at
.
Las siguientes variantes remediarán estas cosas.
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
Sin embargo, cuando intento lo anterior, usando Diseñar 3.2.4, me pongo un nuevo inicio de sesión cuando se auto-inicios de sesión de cookie (login-recuento están estableciendo 1 y current_sign_in_at
). Por lo tanto, me queda solo el problema de querer que el seguimiento se actualice periódicamente, incluso para los usuarios que mantienen la sesión abierta.
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
¿Cuándo se llama al before_filter? Espero no en cada solicitud, y solo antes de la autenticación por primera vez esa sesión? Además, pregunta estúpida, pero ¿dónde agrego before_filter? Intenté agregarlo al modelo de usuario de Devise y obtuve el método undefined before_filter. –
Eso se ejecutaría en cada solicitud; era solo un paso de depuración rápido/sucio para ver si eso lo resolvería antes de implementar una mejor solución. Debería poder agregarlo a cualquier controlador, ApplicationController si lo quiere global. – RobH
Hola Rob, esto es lo que hice al final que a) comprueba que un usuario está conectado antes de forzar un signo_in, yb) asegura que el método sign_in (forzado) solo se ejecuta una vez por sesión.(disculpe el; en lugar de saltos de línea, los comentarios no permiten saltos de línea) 'before_filter proc {if user_signed_in? && session [: logged_signin]; sign_in (current_user,: force => true); session [: logged_signin] = verdadero; end} ' –