Logując użytkownika (czy też innego aktora) w systemie, powinniśmy wykonywać reset sesji. Jest to jedno z podstawowych zabezpieczeń przed atakami typu session fixation. Odbywa się to przez wywołanie metody reset_session.
Ma to jednak swoje minusy. Wszystko co mieliśmy w sesji zostanie utracone.
Jest na to jednak bardzo proste rozwiązanie, wystarczy zapamiętać "na chwilę" wartości które mieliśmy w sesji, a następnie je przywrócić. Najprościej będzie to zrobić, nadpisując w naszym kontrolerze (lub kontrolerze po którym dziedziczymy - według potrzeb) metodę reset_session, w taki oto sposób:
# Resetuje sesję ale zostawiając język i przekierowanie def reset_session lang = session[:locale] url = session[:request_uri] super session[:request_uri] = url session[:locale] = lang end
Warto też pamiętać że po wykonaniu resetu, poprzednie ID sesji jest utracone, a wywołanie po resecie metody:
request.session_options[:id]
zakończy się zwróceniem nila.
Z tego powodu lepiej nie bazować na ID sesji, jako kluczu obcym. O wiele lepiej przetrzymywać takie klucze bezpośrednio w sesji (kluczem może być generowany np. na podstawie id sesji + soli, hash) a kiedy trzeba "kopiować" za pomocą sposobu pokazanego powyżej.
Poleganie na ID sesji może skończyć się naprawdę źle ;)