web-dev-qa-db-fra.com

Comment puis-je effacer toutes les sessions Rails?

Voici mon code:

if session[:firsttimestart].nil? 
else
  @firsttime = false
end

if @firsttime == true
  initglobals()
end
session[:firsttimestart]=false

Le problème est que lorsque j'éteins le serveur et que je reviens à l'application, la session [: firsttimestart] est toujours fausse. En quelque sorte, il stocke cette variable dans mon système sans date d'expiration, de sorte que iniglobals () n'est pas appelée. J'ai essayé d'utiliser rake tmp: clear et cela n'a pas fonctionné. Comment puis-je effacer toutes les sessions que j'utilise dans mon système chaque fois que je redémarre mon serveur?

29
fenec

Si vous stockez vos sessions dans une base de données,

rake db:sessions:clear
25
Anand Shah

Que ce soit une base de données ou un magasin de cookies, utilisez rake tmp:sessions:clear

47
Yevgeniy

Dans Rails 4, la réponse acceptée (rake db:sessions:clear) ne fonctionne plus car ActiveRecord :: SessionStore a été extrait dans la gem active_record-session_store. (Voir ici pour plus d'explications)

Vous pouvez maintenant installer la gemme active_record-session_store et utiliser rake db:sessions:clear comme dans Rails 3, ou créer une tâche de rake personnalisée ressemblant à ceci:

namespace :db do
    namespace :sessions do
        desc "Clear ActiveRecord sessions"
        task :clear => :environment do
            sql = 'TRUNCATE sessions;'
            ActiveRecord::Base.connection.execute(sql)
        end
    end
end
5
bjacobel

Premièrement, nil n'est pas == faux, cependant, nil est évalué à faux. Essayez vous-même si vous ne croyez pas:

irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == nil
=> true

Quel cours signifie:

irb(main):003:0> false.nil?
=> false

Vous pouvez nettoyer votre code de la manière suivante, car il semble que @firsttime n'est jamais défini sur true, où que ce soit.

unless session[:visited]
  session[:visited] = true
  initglobals
end

Enfin, rake tmp: sessions: clear ne fonctionnera que si vous utilisez ActiveRecordStore, si vous utilisez CookieStore (valeur par défaut). Ensuite, vous devrez nettoyer vos cookies ou utiliser reset_session.

4
Omar Qureshi

Le mieux est de changer la clé secrète du déploiement, tous les cookies seront invalidés

techniquement, vous devriez déjà en fournir un via une variable d'environnement.

http://guides.rubyonrails.org/security.html#custom-secrets

pour la tâche de rake, il semble que le nouveau est 

Rails tmp:clear  
2
shigazaru

Dans Rails 5 si vous utilisez ActiveRecord:

ActiveRecord::SessionStore::Session.delete_all

ou pour plus granulaire:

# For example schedule this once a day`
ActiveRecord::SessionStore::Session.where(["updated_at < ?", 2.weeks.ago]).delete_all
2
whodini9

J'utilise Rails 4 et la solution suivante a fonctionné pour moi car je ne veux pas exécuter manuellement rake db:session:clear à chaque démarrage de mon application.

Dans /config/initializer/session_store.rb, ajoutez ce qui suit

ActiveRecord::SessionStore::Session.delete_all

Ceci est identique à la commande rake mais effectué au niveau de l’initialiseur.

2
T.Ng

Pour présenter une solution alternative: vous pouvez modifier le secret_key_base - si l'authentification est effectuée dans une autre application.

0
lafeber