2013-06-06 8 views
8

Ho un'app per rails 4 in cui sto utilizzando Devise per l'autenticazione e funziona perfettamente. Il mio unico problema è che perde la sessione di un utente dopo averlo distribuito sul server e gli utenti devono accedere di nuovo.Devise perde la sessione dopo la distribuzione

Se faccio solo un riavvio di nginx/passeggero (che sto usando per la mia app) non lo perde. Quando distribuisco la mia app, la sto perdendo. Per la distribuzione, inoltre, cancelli automaticamente tutto il database e il mio script di distribuzione esegue il file di semi che genera anche gli utenti.

Attualmente stiamo sviluppando l'app per cui questo tipo di comportamento è accettabile per ora, ma nel futuro quando l'app sarà pronta, non lo faremo in questo modo (ovviamente!).

Quindi questo è un problema dovuto alla reseeding o dovrei controllare qualcos'altro? Vedo che la password crittografata cambia ogni volta che eseguo l'azione di cancellazione/seed, questo ha a che fare con la perdita della sessione utente?

risposta

4

La ragione di questo comportamento è la seguente:

Everytime qualche utente cambia la sua password, escogitare automaticamente signs_out lui.

Quindi, ricodificando i dati, la password viene ricalcolata (anche se la password è la stessa, la nuova password crittografata è diversa da quella precedente). In questo modo l'idea firerà automaticamente all'utente, perché sembra che la password sia cambiata (in base al diverso campo encrypted_password).

Sono riuscito a ignorare questo comportamento, impostando specificatamente la password crittografata nel file seeds.rb e ignorando la convalida.

7

Non si dovrebbe mai cancellare un database durante la distribuzione. Immagina che la tua app sia in esecuzione e che tu abbia centinaia di utenti. Ora apporti alcune modifiche al codice e fai una distribuzione. POOF tutti i tuoi dati e utenti sono spariti! Certamente questo non è quello che vuoi.

In secondo luogo, gli utenti ottenere disconnesso quando si cancella la banca dati potrebbe essere dovuto uno dei seguenti motivi:

  • Stai semina utenti con lo stesso ID? Se l'ID utente cambia quando si rielabora, gli utenti verranno disconnessi

  • È possibile memorizzare sessioni nel database utilizzando config.session_store :active_record_store anziché utilizzare i cookie? In questo caso, la cancellazione del database eliminerà la tabella delle sessioni e disconnetterà tutti gli utenti

  • Rails 4 utilizza un archivio di cookie crittografato per impostazione predefinita. Assicurarsi Sei sicuro che non stai cambiando config.secret_token quando ri-Distribuzione dell'applicazione, nel caso in cui la sua sempre caricato dal database

In definitiva, spazzando via il database è l'unica ragione per cui gli utenti sono sempre connessi, e questa è una cattiva pratica Quindi la cosa più importante da risolvere è non cancellare dati durante le distribuzioni.

+0

La nostra app è in fase di sviluppo, quando sarà in produzione non lo faremo in questo modo, aggiungeremo solo le migrazioni (l'ho scritto nel mio messaggio). Stiamo cambiando/testando troppo, quindi è necessario in questa fase iniziale. L'id dell'utente è definito in modo specifico nel seed in modo tale che gli utenti abbiano lo stesso id ogni volta che si esegue il seeding del database. Non cambiamo secret_token e stiamo usando il default del dispositivo. Allora perché sta succedendo questo? – JohnDel

+0

@JohnDel e gli altri due suggerimenti? tabella delle sessioni e ID utente? – Subhas

+0

Stiamo usando: cookie_store come session_store (all'interno dell'inizializzatore) e gli utenti hanno gli stessi ID prima e dopo la cancellazione/ricomposizione. – JohnDel

2

Se faccio solo un riavvio di nginx/passeggero (che sto usando per la mia app ) non lo perde. Quando sto distribuendo la mia app, la sto perdendo. Per la distribuzione sono anche cancellare automaticamente tutto il database e il mio script di distribuzione esegue il file di semi che genera anche gli utenti .

Se si generano nuovi utenti, i vecchi perdono le sessioni.

Questo perché i valori dei nuovi utenti saranno diversi. Ad esempio, potrebbero non disporre di un set di token di memoria, o se session_id utilizza i valori di user.created_at o user.token_generated_at saranno diversi ogni volta che si rilascia e si ricrea il database.

+0

"Se generi nuovi utenti, quelli vecchi perderanno le loro sessioni". Perché? Le sessioni non sono memorizzate nel browser? Non li memorizzo nel database. – JohnDel

+0

Una sessione è specifica dell'utente. Se crei un nuovo utente, sarà un utente diverso anche se l'indirizzo email potrebbe essere lo stesso. –

+0

Tutte le righe utente sono uguali (id, email ecc.). L'unica cosa che cambia nel database è la password crittografata memorizzata (anche se sto usando la stessa password, il dispositivo lo cripta in una nuova stringa). Perché? Sto memorizzando la sessione in cookie. – JohnDel