2010-01-22 14 views
15

En Django, tengo SESSION_COOKIE_DOMAIN configurado en mi nombre de dominio. Pero realmente me gustaría ejecutar el mismo sitio con dos nombres de dominio diferentes.Django, SESSION_COOKIE_DOMAIN con varios dominios

Con SESSION_COOKIE_DOMAIN establecido, solo el dominio con nombre permite al usuario iniciar sesión. ¿Es posible permitir que ambos dominios inicien sesión?

Respuesta

24

Si configura su dominio de cookie de sesión para comenzar con un "." carácter le permitirá manejar subdominios comodín y compartir una cookie de sesión (sesión de inicio de sesión) en múltiples subdominios.

 
In settings.py: 
SESSION_COOKIE_DOMAIN=".stackoverflow.com" 

Lo anterior permitiría una cookie que se comparte a través de user1.stackoverflow.com y user2.stackoverflow.com.

Si realmente desea que las URL sean diferentes para el mismo sitio, ¿le gustaría que el mismo usuario cambie entre los dos sitios en una sesión de inicio de sesión? ¿O solo desea tener la capacidad de tener dos usuarios diferentes para iniciar sesión en el sitio desde dos url diferentes (que no son subdominios?)

+0

Quiero el segundo. No subdominios. Básicamente, tengo un cliente que tiene un nombre de dominio muy extenso que no es un solo tweet.net y un nombre rápido y que el sitio necesita funcionar para ambos. – interstar

+3

¿Qué tal si agregas un redireccionamiento de 'longname.net' a' shortname.net' para que todos los usuarios solo usen 'shortname.net'? –

+0

Funcionaría entre 'example.com' y' www.example.com' también. –

4

El SessionMiddleware estándar solo admite un SESSION_COOKIE_DOMAIN, que solo es válido para un dominio y subdominios en esto.

Aquí hay una variación que establecerá el dominio de la cookie de forma dinámica en función del host de la solicitud. Para usarlo, simplemente actualice su MIDDLEWARE_CLASSES para usar este SessionHostDomainMiddleware, en lugar de SessionMiddleware. Esta mejor, @jcdyer y @interstar?

import time 

from django.conf import settings 
from django.utils.cache import patch_vary_headers 
from django.utils.http import cookie_date 
from django.contrib.sessions.middleware import SessionMiddleware 

class SessionHostDomainMiddleware(SessionMiddleware): 
    def process_response(self, request, response): 
     """ 
     If request.session was modified, or if the configuration is to save the 
     session every time, save the changes and set a session cookie. 
     """ 
     try: 
      accessed = request.session.accessed 
      modified = request.session.modified 
     except AttributeError: 
      pass 
     else: 
      if accessed: 
       patch_vary_headers(response, ('Cookie',)) 
      if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
       if request.session.get_expire_at_browser_close(): 
        max_age = None 
        expires = None 
       else: 
        max_age = request.session.get_expiry_age() 
        expires_time = time.time() + max_age 
        expires = cookie_date(expires_time) 
       # Save the session data and refresh the client cookie. 
       # Skip session save for 500 responses, refs #3881. 
       if response.status_code != 500: 
        request.session.save() 
        host = request.get_host().split(':')[0] 
        response.set_cookie(settings.SESSION_COOKIE_NAME, 
          request.session.session_key, max_age=max_age, 
          expires=expires, domain=host, 
          path=settings.SESSION_COOKIE_PATH, 
          secure=settings.SESSION_COOKIE_SECURE or None, 
          httponly=settings.SESSION_COOKIE_HTTPONLY or None) 
     return response 
+0

Lo que está pidiendo es exactamente el caso de uso que el framework de sitios está diseñado para acomodar. Sugerir "no hagas eso" no es útil. – jcdyer

+0

En realidad, no @jcdyer, con SESSION_COOKIE_DOMAIN configurado, no podrá usar vanilla SessionMiddleware y site framework. – s29

0

lugar de tener una completa nueva SessionMiddleware que podría alterar las galletas de respuesta de la siguiente manera:

class CrossDomainSessionMiddleware(object): 
    def process_response(self, request, response): 
     if response.cookies: 
      host = request.get_host() 
      # check if it's a different domain 
      if host not in settings.SESSION_COOKIE_DOMAIN: 
       domain = ".{domain}".format(domain=host) 
       for cookie in response.cookies: 
        if 'domain' in response.cookies[cookie]: 
         response.cookies[cookie]['domain'] = domain 
     return response 

(Coloque este Middleware encima de su Middleware de sesión) Puede restringir esto a dominios específicos si lo desea.

Cuestiones relacionadas