web-dev-qa-db-fra.com

Devise Remember Me and Sessions

Je suis confus avec les paramètres de configuration de gem gem:

  # The time the user will be remembered without asking for credentials again.
  config.remember_for = 2.weeks

  # The time you want to timeout the user session without activity. After this
  # time the user will be asked for credentials again.
  config.timeout_in = 10.minutes

Je veux qu'un utilisateur sélectionne la case "Se souvenir de moi" (c'est-à-dire, gardez-moi connecté), mais le délai d'expiration de la session par défaut est de 10 minutes. Après 10 minutes, il me demande de me reconnecter même si j'ai cliqué sur "Se souvenir de moi". Si cela est vrai, le Remember_for n'a vraiment aucun sens. De toute évidence, il me manque quelque chose ici.

42
Arthur Frankel

Le timeout_in vous déconnectera automatiquement dans les 10 minutes suivant l'inactivité et est incompatible avec le remember_me case à cocher. Vous pouvez en avoir un, mais pas les deux.

17
Ryan Bigg

Ryan a raison dans la mesure où la gemme Devise par défaut ne prend pas en charge les options: Rememberable et: Timeoutable. Cependant, comme toutes les choses Ruby, si vous n'aimez pas la décision prise par un autre codeur, en particulier lorsqu'il s'écarte de la norme que la plupart des utilisateurs sont susceptibles d'attendre, vous pouvez simplement la remplacer.

Grâce à un (rejeté) pull request nous pouvons remplacer ce comportement en ajoutant le code suivant en haut de votre fichier de configuration Devise (/config/initializers/devise.rb):

module Devise
  module Models
    module Timeoutable
      # Checks whether the user session has expired based on configured time.
      def timedout?(last_access)
        return false if remember_exists_and_not_expired?
        last_access && last_access <= self.class.timeout_in.ago
      end

      private

      def remember_exists_and_not_expired?
        return false unless respond_to?(:remember_expired?)
        remember_created_at && !remember_expired?
      end
    end
  end
end

Cela vous permettra désormais de configurer les deux options et de les faire fonctionner comme prévu.

config.remember_for = 2.weeks
config.timeout_in = 30.minutes
28
douglasr

Les informations des réponses précédentes sont obsolètes. J'ai testé mon projet, qui utilise Rails 4 et Devise 3.5.1 et également vérifié le code de conception pour être sûr.

Maintenant, il faut voir si Remember Me la case à cocher a été cochée:

  • si yes, il vérifie if remember_exists_and_not_expired, donc utilise essentiellement config.remember_for pour la gestion de session

  • si no, il vérifie if last_access <= timeout_in.ago, en utilisant config.timeout_in en conséquence

9
Rustam A. Gasanov