2009-02-17 21 views
6

Tenemos un par de aplicaciones de Django implementadas en el mismo subdominio. Algunos usuarios avanzados deben saltar entre estas aplicaciones. Noté que cada vez que rebotan entre las aplicaciones, su cookie de sesión recibe una nueva ID de sesión de Django.¿Cómo obtener distintas aplicaciones de Django en el mismo subdominio para compartir cookies de sesión?

No uso mucho la tabla de sesiones de Django excepto en un flujo de trabajo complejo. Si el usuario rebota entre las aplicaciones mientras está en este flujo de trabajo, pierde su sesión y tiene que comenzar de nuevo.

Cavé a través del código de sesión Django y descubrieron que la:

django.conf.settings.SECRET_KEY

se utiliza para realizar una comprobación de integridad en las sesiones sobre cada solicitud. Si la verificación de integridad falla, se crea una nueva sesión. Al darme cuenta de esto, cambié la clave secreta en cada una de estas aplicaciones para usar el mismo valor, pensando que esto permitiría pasar la verificación de integridad y permitirles compartir sesiones de Django. Sin embargo, no pareció funcionar.

¿Hay alguna manera de hacerlo? ¿Me estoy perdiendo algo más?

Gracias de antemano

Respuesta

12

En vez de ello conveniente programar SESSION_COOKIE_NAME a diferentes valores para las dos aplicaciones. Sus usuarios aún tendrán que iniciar sesión dos veces al principio, pero sus sesiones no entrarán en conflicto: si inician sesión en la aplicación A, luego en la aplicación B y vuelven a A, aún tendrán su sesión A.

Compartir sesiones entre instancias de Django probablemente no sea una buena idea. Si quieres algún tipo de inicio de sesión único, investiga algo como django-cas. Todavía tendrá 2 sesiones (como debería), pero el usuario solo iniciará sesión una vez.

+1

+1: mueva las credenciales entre las sesiones de Django. –

+0

Esa es una buena sugerencia. Lo intentaré. Para el SSO, se trata de aplicaciones internas que se integran con una aplicación PHP heredada que se encarga de la autenticación en la sesión de PHP, por lo que no debería ser un problema. Realmente solo necesito que las aplicaciones de Django no pisen la sesión de los demás en este momento. Thx –

+0

Esto hizo el truco.Ahora me siento un poco tonto porque no lo consideré :) –

8

Acepto que compartir sesiones entre instancias de Django probablemente no sea una buena idea. Si realmente quisiera, podría:

  • Asegúrese de que los dos aplicaciones Django comparten el mismo SECRET_KEY
  • asegurarse de que las dos aplicaciones Django comparten el mismo SeSSON_COOKIE_NAME
  • asegúrese de que la SESSION_COOKIE_DOMAIN se establece en algo que permite que las dos instancias compartan cookies. (Si realmente comparten el mismo subdominio, su configuración actual probablemente sea correcta.)
  • asegúrese de que ambas instancias de Django utilicen el mismo backend de sesión (la misma base de datos, el mismo directorio de archivos, la misma configuración de memcached, etc.)
  • asegurarse de que nada puesto en la sesión tiene sentido en ambas bases de datos de Django:., por lo menos, que va a incluir el ID de usuario, ya que Django utiliza autenticación que recordar qué usuario está conectado a

Todo lo que ¡Dije, no he intentado todo esto, así que todavía puedes tener problemas!

+0

Asumiendo dos bases de datos/modelos separados, supongo que también es necesario clonar el modelo de usuario en ambos proyectos y mantenerlos sincronizados. Y al recuperar instancias de usuario o modificarlas, es importante seleccionar manualmente la misma base de datos (usando = ...). La tabla de la base de datos del usuario se crearía en ambos proyectos, pero solo una se llenaría de datos. Solo pensando en el problema ... ¿estarías de acuerdo? –

Cuestiones relacionadas