Comment vider / détruire une session en rails?

133

Je n'arrive pas à le trouver nulle part ... Comment supprimer / détruire / réinitialiser / vider / effacer la session d'un utilisateur dans Rails? Pas seulement une valeur mais le tout.

tybro0103
la source

Réponses:

203

Pour effacer le tout, utilisez la méthode reset_session dans un contrôleur.

reset_session

Voici la documentation sur cette méthode: http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

Réinitialise la session en effaçant tous les objets stockés dans et en initialisant un nouvel objet de session.

Bonne chance!

Gdeglin
la source
1
Pour les sessions basées sur une base de données (que vous devriez probablement utiliser), vous pouvez expirer via une requête: guides.rubyonrails.org/security.html#session-expiry
m33lky
44

session in rails est un objet de hachage. Par conséquent, toute fonction disponible pour effacer le hachage fonctionnera avec les sessions.

session.clear

ou si des clés spécifiques doivent être détruites:

session.delete(key)

Testé dans les rails 3.2

ajoutée

Les gens ont mentionné par session={}est une mauvaise idée. En ce qui concerne session.clear, Lobati commente - Il semble que vous feriez probablement mieux d'utiliser reset_session [que session.clear], car il effectue un autre nettoyage au-delà de ce que fait session.clear. En interne, reset_session appelle session.destroy , qui lui-même appelle clear ainsi que d'autres choses.

Lavixu
la source
Quelqu'un a-t-il des réflexions sur les mérites de cette méthode par rapport à celle recommandée par Gdeglin?
Peter Berg
3
Cela peut être utilisé lorsque vous souhaitez conserver d'autres paramètres mais supprimer une paire clé / valeur particulière.
Lavixu
1
Cela ne réinitialisera pas du tout la session, cela affectera une variable locale. N'utilisez jamais cette technique pour réinitialiser la session: session = {}
alexspeller
4
La documentation Rails , à la section 5.1 Accès à la session, recommande d'utiliser reset_session si vous voulez supprimer les paires clé / valeur insérées dans le script (ex: quelque chose d'inséré à partir d'un contrôleur) et générer une nouvelle session. Si vous souhaitez réinitialiser uniquement les paires clé / valeur que vous avez définies, définissez ces clés sur nil.
sargas
1
@barlop Il semble que vous feriez probablement mieux d'utiliser reset_session, car il fait un autre nettoyage au-delà de ce que session.clearfait. En interne, les reset_sessionappelssession.destroy , qui eux- mêmes appellent clearégalement d'autres choses .
lobati
6

pour supprimer la session d'un utilisateur

session.delete(:user_id)
vjnan369
la source
Attention, vous pouvez supprimer l'enregistrement utilisateur de la base de données!
Arthur
2
@Arthur Ce n'est pas vrai. Mais vous ne supprimerez que la clé: user_id de la session et non de toute la session
Andión
5

Pour effacer uniquement certains paramètres, vous pouvez utiliser:

[:param1, :param2, :param3].each { |k| session.delete(k) }
VladCovaliov
la source
2

ajoutez ce code à votre ApplicationController

def reset_session
  @_request.reset_session
end

(Je ne sais pas pourquoi personne ci-dessus ne mentionne simplement ce code car il a résolu mon problème) http://apidock.com/rails/ActionController/RackDelegation/reset_session

David Mesaros
la source
Je trouve que @_request.reset_sessionet les reset_sessiondeux fonctionnent et peut-être faire la même chose?
barlop le