OK… Voici le contenu du jon de poteau de blog…
Rubis : Using le reset_session dans des rails avec le concombre et le Webrat
J'ai classé le bogue suivant :
Tous les guides de degré de sécurité de rails disent que vous devriez appeler le reset_session après que l'utilisateur ouvre une session ou se déconnecte. Ceci dégage dehors la session et force une nouvelle identification de session pour être créé. Il semble qu'il y a eu quelques bogues de rails liés au reset_session au cours des années. Cependant, je suis maintenant inquiété qu'il y ait un conflit quelque part lié à l'infrastructure et/ou au Webrat de l'essai des rails.
Dans mon action d'ouverture, j'appelle le reset_session et puis mets un message gentil dans le flash. Quand j'emploie réellement le site Web, je peux voir (par l'intermédiaire de Firefox) que j'obtiens une nouvelle identification de session, et je peux voir mon message instantané. Cependant, quand j'écris des essais pour ces deux choses, le message instantané perd, et je n'obtiens pas une nouvelle identification de session en mes biscuits. Elle est presque comme si la nouvelle session est ignorée, et la vieille session est employée.
Je suis désolé, mais je ne peux pas dire exactement où le problème est. Je sais qu'il y a le code spécial de rails qui manipule des biscuits de session quand vous faites l'essai d'intégration.
J'emploie actionpack-2.3.8 et webrat-0.7.1.
Voici comment j'ai fait mon meilleur pour travailler autour du problème.
Tout d'abord, je stocke mes sessions dans la base de données. Par conséquent, j'ai créé un modèle d'ActiveRecord pour supprimer manuellement des disques de session :
le reset_session de session <� ActiveRecord::Base=""> # de rails de classe n'a été rien mais ennui pour nous. Je prends
# importe dans mes propres mains. Ce code devra changer si nous nous arrêtons
# mettant nos sessions dans la base de données.
def self.nuke_session (session_id)
find_by_session_id ! (session_id) .destroy
extrémité
extrémité
Puisque je suis utilisation authlogic, mon action de déconnexion regarde n'importe quoi de pareil :
le def détruisent
current_user_session.destroy
# éviter les attaques de fixation de session. Ceci peut sembler superflu, mais il était
# nécessaire de faire le passage d'essais.
session [: test_that_this_disappears] = « correct »
session_id = biscuits [ActionController : : Base.session_options [: clef]]
Session.nuke_session (session_id)
reset_session
redirect_to : => d'action : logged_out
extrémité
Mon action d'ouverture est n'importe quoi de pareil :
le def créent
@user_session = UserSession.new (param [: user_session])
à moins que @user_session.valid ?
le retour rendent : => d'action : nouveau
extrémité
# éviter les attaques de fixation de session en remettant à zéro la session.
reset_session
@user_session = UserSession.new (param [: user_session])
@user_session.save !
# pour quelque raison, le flash, le reset_session, le concombre, etc. ne subsistent pas,
# ainsi je dois passer le message instantané par l'intermédiaire d'un paramètre.
redirect_to (root_url (: => d'ouverture 1))
extrémité
Au lieu de placer un message par l'intermédiaire du flash, je passe un paramètre de question.
Je vérifie ce paramètre dans mon ApplicationController :
before_filter : check_for_login_message
…
# pour quelque raison, le flash, le reset_session, le concombre, etc. ne subsistent pas.
# par conséquent, après ouverture, nous devons passer le message instantané par l'intermédiaire d'un paramètre de question
# plutôt que par l'intermédiaire du flash.
#
# si je dois faire ce genre de chose encore, je créerai une table de consultation complètement
# des messages.
check_for_login_message de def
flash.now [: success_message] = « ouverture réussie ! » si param [: ouverture]
extrémité
En conclusion, j'ai ceci dans un dossier de dispositif :
# cet essai devrait fonctionner. En fait, cela fonctionne quand vous employez votre navigateur.
# cependant, il y a un bogue quelque part entre les rails et le Webrat qui empêche
# il du travail quand vous employez le concombre. De façon ou d'autre, le reset_session est cassé.
#
# scénario : ouvrir une session devrait infirmer votre biscuit de session
# donné je suis sur la page d'accueil
# quand je regarde mon biscuit de session
# et moi suis ouvert une session
# alors je devrais prendre un biscuit différent de session
Cet essai se fonde sur ces étapes :
# cet essai devrait fonctionner. En fait, cela fonctionne quand vous employez votre navigateur.
# cependant, il y a un bogue quelque part entre les rails et le Webrat qui empêche
# il du travail quand vous employez le concombre. De façon ou d'autre, le reset_session est cassé.
#
# le regard donné de/^I à ma session cookie$/font
# @cookie = biscuits [ActionController : : Base.session_options [: clef]]
# extrémité
#
# alors/^I devrait avoir une session différente cookie$/fait
# new_cookie = biscuits [ActionController : : Base.session_options [: clef]]
# @cookie de == d'ould_not de new_cookie.sh
# extrémité