Devise verliert Sitzung nach der Bereitstellung

8

Ich habe eine Rails 4-App, in der ich ein Gerät zur Authentifizierung verwende und es funktioniert perfekt. Mein einziges Problem ist, dass es die Sitzung eines Benutzers verliert, nachdem ich es auf dem Server bereitgestellt habe und die Benutzer sich erneut anmelden müssen.

Wenn ich gerade einen Neustart von nginx / passagier (was ich für meine App verwende) mache, verliert es es nicht. Wenn ich meine App bereitstelle, verliere ich sie. Zur Bereitstellung lösche ich auch die gesamte Datenbank automatisch und mein Deployment-Skript führt die Seeds-Datei aus, die auch die Benutzer generiert.

Wir entwickeln gerade die App, damit diese Art von Verhalten jetzt akzeptabel ist, aber in der Zukunft, wenn die App bereit sein wird, werden wir es nicht so machen (natürlich!).

Also ist das ein Problem aufgrund der Nachsaat oder ich sollte etwas anderes überprüfen? Ich sehe, dass sich das verschlüsselte Passwort jedes Mal ändert, wenn ich die Wipe-Out- / Seed-Aktion ausführe, hat dies mit dem Verlust der Benutzersitzung zu tun?

    
JohnDel 06.06.2013, 15:18
quelle

3 Antworten

3

Der Grund für dieses Verhalten ist der folgende:

Jedes Mal, wenn ein Benutzer sein Passwort ändert, entwirft er automatisch signs_out ihn.

Im Grunde wird das Passwort neu berechnet, indem die Daten erneut eingegeben werden (obwohl das Passwort dasselbe ist, ist das neue verschlüsselte Passwort anders als das alte). So wird das Gerät den Benutzer automatisch signieren, da es so aussieht, als ob das Passwort geändert wurde (basierend auf dem anderen Feld chiffriertes_passwort).

Ich habe es geschafft, dieses Verhalten zu umgehen, indem ich das verschlüsselte_passwort in der Datei seeds.rb speziell eingerichtet habe und die Validierung umgangen habe.

    
JohnDel 12.06.2013, 18:34
quelle
7

Sie sollten niemals während der Bereitstellung eine Datenbank löschen. Stellen Sie sich vor, Ihre App läuft und Sie haben Hunderte von Benutzern. Jetzt nehmen Sie einige Änderungen am Code vor und führen eine Bereitstellung durch. POOF alle Ihre Daten und Benutzer sind weg! Sicherlich ist das nicht was du willst.

Zweitens können Benutzer, die beim Löschen der Datenbank ausgeloggt werden, einen der folgenden Gründe haben:

  • Setzt du Nutzer mit derselben ID? Wenn sich die Benutzer-ID beim erneuten Start ändert, werden Benutzer ausgeloggt

  • Speichern Sie Sitzungen in der Datenbank mit config.session_store :active_record_store , anstatt Cookies zu verwenden? In diesem Fall löscht die Löschung der Datenbank die Sitzungstabelle und meldet alle Benutzer ab

  • Rails 4 verwendet standardmäßig einen verschlüsselten Cookie-Speicher. Stellen Sie sicher, dass Sie die config.secret_token Ihrer Anwendung bei der erneuten Bereitstellung nicht ändern, falls sie von der Datenbank geladen wird

Letztendlich ist das Löschen der Datenbank der einzige Grund, warum Ihre Benutzer ausgeloggt werden, und das ist eine schlechte Übung. Das Wichtigste, was zu beheben ist, ist Daten während Bereitstellungen nicht löschen .

    
Subhas 08.06.2013 16:38
quelle
2
  

Wenn ich gerade einen Neustart von nginx / passagier mache (was ich für meine   App) es verliert es nicht. Wenn ich meine App bereitstelle, verliere ich sie.   Zum Deployment lösche ich auch automatisch die gesamte Datenbank und meine   Deployment-Skript führt die Seeds-Datei aus, die es ebenfalls generiert   Benutzer.

Wenn Sie neue Benutzer generieren, verlieren die alten ihre Sitzungen.

Dies liegt daran, dass die Werte der neuen Benutzer unterschiedlich sind. Zum Beispiel haben sie möglicherweise kein Erinnerungs-Token gesetzt, oder wenn die Session-ID die Werte von user.created_at oder user.token_generated_at verwendet, sind sie jedes Mal anders, wenn Sie Ihre Datenbank löschen und neu erstellen.

    
Benjamin Udink ten Cate 11.06.2013 18:36
quelle