web-dev-qa-db-fra.com

Comment puis-je réinitialiser toutes les sessions de conception afin que chaque utilisateur doive se reconnecter?

À un certain point mystérieux X avec cette application Rails hébergée sur heroku, un utilisateur connecté était soudainement connecté en tant qu'un autre utilisateur. J'utilise la pierre précieuse pour l'authentification.

Cela s'est produit pour 2 utilisateurs que nous connaissons. Je suis actuellement à la recherche de la cause fondamentale de ce problème.

Ce que je dois faire maintenant, c’est invalider toutes les sessions d’élaboration afin de forcer les utilisateurs à se connecter à nouveau. Une fois qu'un utilisateur s'est connecté, le problème semble disparaître.

J'ai essayé de réinitialiser secret_token mais je n'ai pas été obligé de me connecter à nouveau. J'ai ensuite réduit mes dynos Web, puis mes sauvegardes. J'ai aussi redémarré l'application. Tous essayant d'obtenir le changement secret_token pour réinitialiser les sessions. 

D'autres idées?

21
JB.

Changer votre session_token fonctionnera si vous stockez vos sessions dans des cookies (par défaut). 

Mais si vous stockez dans active_record, vous pouvez supprimer toutes les sessions en:

rake db:sessions:clear

alors: BAM! pas plus de sessions.

16
Jesse Wolgamott

Vous devriez pouvoir modifier le nom du cookie de session pour invalider toutes les sessions hébergées dans config/initializers/session_store.rb.

YourApp::Application.config.session_store :cookie_store, key: '_change_me_session'
22
djcp

Si vos sessions ne stockent aucune autre information critique, vous pouvez effacer les sessions:

rake db:sessions:clear
4
Matchu

Mise à jour sur la réponse acceptée, maintenant c'est

rake tmp:clear 

rake -T ... rake tmp:create # Creates tmp directories for sessions, cache, sockets, and pids

3
lab419

Devise a une chose appelée timeoutable pouvez-vous travailler avec ça?

1
catsby

Check-out 

  module ClassMethods
    Devise::Models.config(self, :timeout_in)
  end

Je suppose que vous pourriez faire quelque chose comme:

User.all.each do |user|
  user.timeout_in 1.second
end

Mais je ne sais pas si cela ne gère que les nouvelles sessions… et non les sessions existantes?

En fait, c’est trop complexe .. essayez juste:

User.all.each do |user|
  sign_out user
end

Voir ce message Déconnectez tous les utilisateurs avec Devise

pour faire quelque chose comme ça depuis la console, vous devrez vérifier cet exemple et l’ajuster à vos besoins

Comment connecter un utilisateur à l'aide de Devise à partir d'une console Rails?

1
Abram

Lorsque le magasin de cookies est utilisé, nous devons régénérer l'application secret_token utilisée pour chiffrer les cookies.

fichier à configurer secret_token: config/initializers/secret_token.rb

bundle exec rake secret Peut être utilisé pour générer un nouveau jeton secret.

https://www.tigraine.at/2012/08/03/how-to-expire-all-active-sessions-in-Rails-3

0
Arjun

sign_out_all_scopes (lock = true) ⇒ Objet

Déconnectez tous les utilisateurs ou portées actifs. Cet assistant est utile pour déconnecter tous les rôles en un clic. Cela permet de signer TOUTES les étendues du gardien. Renvoie true s'il y a eu au moins une déconnexion et false si aucun utilisateur n'a été connecté sur toutes les étendues.

source: http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut

0
plombix