2009-02-17 14 views
6

Abbiamo un paio di applicazioni Django distribuite sullo stesso sottodominio. Alcuni utenti esperti devono saltare tra queste applicazioni. Ho notato che ogni volta che rimbalzano tra le applicazioni il loro cookie di sessione riceve un nuovo ID di sessione da Django.Come ottenere distinte app Django sullo stesso sottodominio per condividere cookie di sessione?

Non uso molto la tabella di sessione di Django tranne in un flusso di lavoro complesso. Se l'utente rimbalza tra le applicazioni mentre si trova in questo flusso di lavoro, perde la sessione e deve ricominciare da capo.

ho scavato attraverso il codice di sessione Django e ha scoperto che il:

django.conf.settings.SECRET_KEY

viene utilizzato per eseguire un controllo di integrità sui sessioni su ogni richiesta. Se il controllo di integrità fallisce, viene creata una nuova sessione. Comprendendo ciò, ho modificato la chiave segreta in ognuna di queste applicazioni per utilizzare lo stesso valore, pensando che questo avrebbe permesso il superamento del controllo di integrità e consentire loro di condividere le sessioni di Django. Tuttavia, non sembrava funzionare.

C'è un modo per farlo? Mi manca qualcos'altro?

Grazie in anticipo

risposta

12

vorrei invece consigliare di impostare SESSION_COOKIE_NAME a diversi valori per le due applicazioni. I tuoi utenti dovranno comunque effettuare il login due volte inizialmente, ma le loro sessioni non entreranno in conflitto - se accedono all'app A, quindi all'app B, e ritornano ad A, avranno comunque la loro sessione A.

Condividere sessioni tra istanze di Django non è probabilmente una buona idea. Se vuoi una sorta di single-sign-on, cerca qualcosa come django-cas. Avrai ancora 2 sessioni (come dovresti), ma l'utente effettuerà l'accesso solo una volta.

+1

+1: sposta le credenziali tra le sessioni di Django. –

+0

Questo è un buon suggerimento - farò un tentativo. Per l'SSO, si tratta di app interne integrate con un'app di PHP legacy che si occupa dell'autenticazione nella sessione PHP, quindi non dovrebbe essere un problema. Ho davvero bisogno che le app di Django non si calpestino le altre sessioni a questo punto. Thx –

+0

Questo ha fatto il trucco.Ora mi sento un po 'sciocco che non ho considerato io :) –

8

Concordo sul fatto che condividere sessioni tra istanze di Django non è probabilmente una buona idea. Se si voleva davvero, si potrebbe:

  • assicurarsi che le due applicazioni Django condividono lo stesso SECRET_KEY
  • assicurarsi che le due applicazioni Django condividono lo stesso SeSSON_COOKIE_NAME
  • assicurarsi che il SESSION_COOKIE_DOMAIN è impostato su qualcosa che lascia che le due istanze condividano i cookie. (Se davvero condividono lo stesso sottodominio, probabilmente la tua impostazione attuale va bene.)
  • assicurati che entrambe le istanze di Django utilizzino lo stesso backend di sessione (lo stesso database, la stessa directory di file, la stessa configurazione memcached, ecc.)
  • assicurarsi che qualsiasi cosa mettere nella sessione ha senso in entrambi i database Django:. per lo meno, che sarà includere l'ID utente, poiché Django auth utilizza per ricordare quale utente è collegato

Tutto ciò che Detto questo, in realtà non ho provato tutto questo, quindi potresti avere ancora problemi!

+0

Supponendo due database/modelli separati, immagino, è anche necessario clonare il modello utente in entrambi i progetti e mantenerli sempre sincronizzati. E quando si recuperano le istanze utente o le si modifica, è importante selezionare manualmente lo stesso database (usando = ...). La tabella del database utente verrebbe creata in entrambi i progetti, ma solo uno sarebbe effettivamente riempito con i dati. Stai pensando al problema ... saresti d'accordo? –

Problemi correlati