2013-06-06 21 views
8

Mam aplikację rails 4, w której używam narzędzia devise do uwierzytelniania i działa idealnie. Jedynym moim problemem jest to, że traci sesję użytkownika po jej wdrożeniu na serwerze, a użytkownicy muszą się ponownie zalogować.Devise przegrywa sesję po wdrożeniu

Jeśli po prostu wykonam restart Nginx/Pasażera (którego używam dla mojej aplikacji), to go nie straci. Gdy wdrażam aplikację, tracę ją. Wdrożenie powoduje także automatyczne wymazanie całej bazy danych, a mój skrypt wdrażania uruchamia plik zarodków, który również generuje użytkowników.

Obecnie tworzymy aplikację, więc tego rodzaju zachowania są do przyjęcia, ale w przyszłości, gdy aplikacja będzie gotowa, nie zrobimy tego w ten sposób (oczywiście!).

Czy to jest problem związany z ponownym nasadzeniem, czy powinienem sprawdzić coś innego? Widzę, że zaszyfrowane hasło zmienia się za każdym razem, gdy uruchamiam akcję wymazywania/seedowania, czy ma to związek z przegraną sesji użytkownika?

Odpowiedz

4

Powodem takiego zachowania jest następująca:

Everytime jakiś użytkownik zmieni swoje hasło, opracować automatycznie signs_out niego.

Tak więc, zasadniczo poprzez ponowne wysłanie danych, hasło jest ponownie obliczane (mimo że hasło jest takie samo, nowe zaszyfrowane hasło różni się od starego). Tak więc program automatycznie wyloguje użytkownika, ponieważ wygląda na to, że hasło zostało zmienione (na podstawie innego pola zaszyfrowanego_hasła).

Udało mi się ominąć to zachowanie, szczególnie konfigurując zaszyfrowane_hasło w pliku seeds.rb i pomijając sprawdzanie poprawności.

7

Nie należy nigdy wymazywać bazy danych podczas wdrażania. Wyobraź sobie, że Twoja aplikacja działa i masz setki użytkowników. Teraz wprowadzasz zmiany w kodzie i wdrażasz. POOF wszystkie twoje dane i użytkownicy zniknęli! Na pewno nie tego chcesz.

Po drugie, użytkownicy coraz wylogowanie po wymazać baza danych może być spowodowane jedną z następujących przyczyn:

  • Czy siewu użytkownicy z tego samego identyfikatora? Jeśli identyfikator użytkownika zmieni się po ponownym uruchomieniu, spowoduje to wylogowanie użytkowników. W takim przypadku wyczyszczenie bazy danych spowoduje usunięcie tabeli sesji i wylogowanie wszystkich użytkowników. Domyślnie Rails 4 używa domyślnie zaszyfrowanego magazynu plików cookie. Sprawi, że na pewno nie jesteś zmieniając aplikacji config.secret_token podczas ponownego wdrażania, w przypadku jej uzyskiwanie ładowane z bazy

Ostatecznie, unicestwiając bazy danych jest jedynym powodem, dla którego użytkownicy są coraz wylogować, a to jest zła praktyka. Najważniejszą rzeczą do naprawienia jest: nie czyść danych podczas wdrażania.

+0

Nasza aplikacja jest w fazie rozwoju, kiedy będzie w produkcji, nie zrobimy tego w ten sposób, dodamy tylko migracje (napisałem to w mojej wiadomości). Zmieniamy/testujemy za dużo, dlatego jest to konieczne w tej początkowej fazie. Identyfikator użytkownika jest specyficznie zdefiniowany w elemencie seed, więc użytkownicy mają ten sam identyfikator za każdym razem, gdy wysyłamy bazę danych. Nie zmieniamy secret_token i używamy domyślnego urządzenia. Dlaczego tak się dzieje? – JohnDel

+0

@JohnDel o innych dwóch sugestiach? tabela sesji i identyfikator użytkownika? – Subhas

+0

Używamy: cookie_store jako session_store (wewnątrz inicjalizatora), a użytkownicy mają te same identyfikatory przed i po wymazywaniu/ponownym wysyłaniu. – JohnDel

2

Jeśli po prostu wykonam restart Nginx/Pasażera (którego używam dla mojej aplikacji ), to go nie straci. Kiedy wdrażam aplikację, tracę ją. Do rozmieszczania również automatycznie usuwam całą bazę danych, a mój skrypt wdrażania uruchamia plik źródłowy, który generuje także użytkowników .

Jeśli generujesz nowych użytkowników, stare stracą swoje sesje.

Dzieje się tak dlatego, że wartości nowych użytkowników będą różne. Na przykład mogą nie mieć zestawu tokenów z pamięcią lub jeśli identyfikator session_id używa wartości user.created_at lub user.token_generated_at, będą one różne za każdym razem, gdy usuniesz i ponownie utworzysz bazę danych.

+0

"Jeśli będziesz generować nowych użytkowników, stare stracą swoje sesje". Czemu? Czy sesje nie są przechowywane w przeglądarce? Nie przechowuję ich w bazie danych. – JohnDel

+0

Sesja jest zależna od użytkownika. Jeśli utworzysz nowego użytkownika, będzie to inny użytkownik, nawet jeśli adres e-mail będzie taki sam. –

+0

Wszystkie wiersze użytkownika są takie same (identyfikator, adres e-mail itd.). Jedyną rzeczą, która zmienia się w bazie danych jest przechowywane zaszyfrowane hasło (mimo że używam tego samego hasła, program szyfruje je w nowym ciągu). Czemu? Przechowuję sesję w pliku cookie. – JohnDel