APPROVAZIONE… Qui è il contenuto del jon dell'alberino del blog…
Rubino: Using il reset_session in rotaie con il cetriolo e Webrat
Ho archivato il seguente insetto:
Tutte le guide di sicurezza delle rotaie dicono che dovreste denominare il reset_session dopo che l'utente entra o annota fuori. Ciò elimina fuori la sessione e forza una nuova identificazione di sessione per essere generata. Sembra che ci siano stati alcuni insetti delle rotaie relativi al reset_session nel corso degli anni. Tuttavia, ora sono preoccupato che ci sia un conflitto in qualche luogo relativo all'infrastruttura e/o a Webrat di prova delle rotaie.
Nella mia azione di inizio attività, denomino il reset_session ed allora metto un messaggio piacevole nel flash. Quando realmente uso il Web site, posso vedere (via Firefox) che sto ottenendo una nuova identificazione di sessione e posso vedere il mio messaggio istantaneo. Tuttavia, quando scrivo le prove per quelle due cose, il messaggio istantaneo ottiene perso e non ottengo una nuova identificazione di sessione in miei biscotti. È quasi come se la nuova sessione stia ignoranda e la vecchia sessione sta usanda.
Sono spiacente, ma non posso dire esattamente dove il problema è. So che ci è codice speciale delle rotaie che tratta i biscotti di sessione quando state facendo la prova di integrazione.
Sto usando actionpack-2.3.8 e webrat-0.7.1.
Qui è come ho fatto il mio meglio per lavorare intorno al problema.
In primo luogo, sto immagazzinando le mie sessioni nella base di dati. Quindi, ho generato un modello di ActiveRecord per cancellare manualmente le annotazioni di sessione:
il reset_session di sessione <� ActiveRecord::Base=""> # delle rotaie del codice categoria è stato niente ma difficoltà per noi. Sto prendendo
# importa nelle mie proprie mani. Questo codice dovrà cambiare se ci arrestiamo
# mettendo le nostre sessioni nella base di dati.
def self.nuke_session (session_id)
find_by_session_id! (session_id) .destroy
estremità
estremità
Poiché sono usando authlogic, la mia azione di termine attività osserva qualcosa di simile:
il def distrugge
current_user_session.destroy
# evitare gli attacchi di fissazione di sessione. Ciò può sembrare ridondante, ma era
# necessario fare il passaggio delle prove.
sessione [: test_that_this_disappears] = “giusto„
session_id = biscotti [ActionController:: Base.session_options [: chiave]]
Session.nuke_session (session_id)
reset_session
redirect_to: => di azione: logged_out
estremità
La mia azione di inizio attività è qualcosa di simile:
il def genera
@user_session = UserSession.new (params [: user_session])
a meno che @user_session.valid?
il ritorno rende: => di azione: nuovo
estremità
# evitare gli attacchi di fissazione di sessione ripristinando la sessione.
reset_session
@user_session = UserSession.new (params [: user_session])
@user_session.save!
# per qualche motivo, il flash, il reset_session, il cetriolo, ecc. non ottengono avanti,
# così devo passare il messaggio istantaneo via un parametro.
redirect_to (root_url (: => di inizio attività 1))
estremità
Invece di regolazione del messaggio via il flash, passo un parametro di domanda.
Controllo per vedere se c'è questo parametro nel mio ApplicationController:
before_filter: check_for_login_message
…
# per qualche motivo, il flash, il reset_session, il cetriolo, ecc. non ottengono avanti.
# quindi, dopo l'inizio attività, dobbiamo passare il messaggio istantaneo via un parametro di domanda
# piuttosto che via il flash.
#
# se devo ripetere questo genere di cosa, genererò una tabella di occhiata in pieno
# dei messaggi.
check_for_login_message del def
flash.now [: success_message] = “inizio attività riuscito!„ se params [: inizio attività]
estremità
Per concludere, ho questo in una lima della caratteristica:
# questa prova dovrebbe funzionare. Infatti, funziona quando usate il vostro browser.
# tuttavia, ci è un insetto in qualche luogo fra le rotaie e Webrat che evita
# esso dal funzionamento quando usate il cetriolo. In qualche modo, il reset_session è rotto.
#
# piano d'azione: il collegamento dovrebbe invalidare il vostro biscotto di sessione
# dato sono sul homepage
# quando esamino il mio biscotto di sessione
# ed io sono entrati
# allora dovrei mangiare un biscotto differente di sessione
Quella prova conta su questi punti:
# questa prova dovrebbe funzionare. Infatti, funziona quando usate il vostro browser.
# tuttavia, ci è un insetto in qualche luogo fra le rotaie e Webrat che evita
# esso dal funzionamento quando usate il cetriolo. In qualche modo, il reset_session è rotto.
#
# lo sguardo dato di/^I alla mia sessione cookie$/fa
# @cookie = biscotti [ActionController:: Base.session_options [: chiave]]
# estremità
#
# allora/^I dovrebbe avere una sessione differente cookie$/fa
# new_cookie = biscotti [ActionController:: Base.session_options [: chiave]]
# @cookie del == del ould_not di new_cookie.sh
# estremità