10
votes

Devise: mémorable signifie que last_sign_in_at n'est pas mis à jour par suivi

J'ai l'utilisation du congé et je compte sur Last_Sign_in_AT sur le modèle utilisateur pour déterminer si mes clients ne sont pas retournés dans les x jours. Cependant, j'ai récemment découvert que last_sign_in_at est uniquement mis à jour lorsqu'un logement de formulaire réel se produit, par opposition au moment où un utilisateur est connecté automatiquement en raison de l'inclusion de mémoires mémorables.

Si vous souhaitez vous assurer que last_sign_in_at est mis à jour chaque fois qu'un utilisateur se connecte (une nouvelle session de navigateur), que ce soit d'utiliser un formulaire pour se connecter ou être automatiquement connecté par le cookie mémorable, comment irai-je continuer à faire Ceci de manière compatible du concevoir?


0 commentaires

5 Réponses :


6
votes

Le crochet traquable est de Warden's After_set_user A > Crochet - Ce que vous pourriez faire pour remédier facilement à ce que cela soit défini A avant_filter pour appeler signe_in .

Ceci pourrait être optimisé, mais Testez pour voir si vous utilisez P>

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


4 commentaires

Quand est-ce que l'avant_filter est appelé? Je n'espère pas sur chaque demande et seulement sur l'authentification avant la première fois cette session? Aussi, question stupide, mais où puis-je ajouter avant_filter? J'ai essayé de l'ajouter au modèle d'utilisateur du congé et j'ai eu une méthode indéfinie avant_filter.


Ce serait exécuté sur chaque demande - c'était juste une étape de débogage rapide / sale pour voir si cela le résoudrait avant de mettre en œuvre une meilleure solution. Vous devriez être capable de l'ajouter à n'importe quel contrôleur, applicationController si vous le souhaitez global.


Bonjour Rob, c'est ce que je suis allé à la fin, lequel a) vérifie qu'un utilisateur est connecté avant de forcer un signe_in, et b) garantit que la méthode SIGN_IN (forcée) n'est exécutée qu'une fois par session. (Excusez le; au lieu de pauses de ligne, les commentaires ne permettent pas les pauses de ligne) avant_filter proc {si user_signed_in? && Session [: Logged_signin]; signe_in (actuel_user ,: forcer => vrai); Session [: Logged_Signin] = true; fin}


Ceci est également applicable si vous utilisez le module saml_authenticatetable , qui ne met pas à jour les champs suivis correctement.



15
votes

Prendre la solution de Matthew, je pense que le code doit être le suivant (notez le non-opérateur avant la session [: 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


2 commentaires

Est-ce la meilleure solution encore?


J'ai compris. Vous utilisez un paramètre de cookie personnalisé pour vérifier s'il s'agit d'une nouvelle ou d'une session existante. Merci pour la pointe, cela ressemble à une approche beaucoup plus propre dans mon cas car cela signifie que je n'ai pas à creuser dans les internes de Devise.



-1
votes

afaik Vous pouvez également utiliser update_tracked_fields! sur ce actuel_user modèle.


1 commentaires

update_tracked_fields! prend la demande comme paramètre. Depuis que le congé suit également la propriété intellectuelle. Faites cela dans le contrôleur, actuel_user.update_tracked_fields! (Demande) .



2
votes

Devise: mémorable signifie que last_sign_in_at n'est pas mis à jour par Trackable

en expansinant sur des solutions précédentes, le problème avec eux serait que si l'utilisateur signe normalement, ils "signeront deux fois". Qui définira last_sign_in_at code> sur identique (ou presque la même) valeur que actuel_sign_in_at code>. Sur mon site, j'utilise last_sign_in_at code> pour permettre à l'utilisateur de savoir ce qui s'est passé depuis la dernière fois qu'ils ont visité le site, et en tant que tel, j'en ai besoin pour être un peu précis. En outre, il enregistre le nombre de login +1. P>

En outre, il y a des gens (comme moi-même) qui laissent une fenêtre de navigateur ouverte pendant des jours sans le fermer (et donc ne pas nettoyer le drapeau de la session). À des fins métriques, etc., il peut être utile si un tel comportement de l'utilisateur actualise parfois le actuel_sign_in_at code> heure. P>

Les variantes ci-dessous remédieront à ces éléments. P>

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 commentaires

0
votes

sur le Application_Controller Code> Vous pouvez définir un avant_action code> qui vérifie si le courant_sign_in_at de l'utilisateur actuel est plus long alors x. S'il s'agit, utilisez ensuite signe_in (actuel_user, force: true) code> qui met à jour le courant_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


2 commentaires

Pouvez-vous fournir un commentaire ou une explication?


Mise à jour de la réponse