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.
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.
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
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