2013-03-25 59 views
4

最近,我们改变了我们的Cookie域(settings.SESSION_COOKIE_DOMAIN)从domain.com.domain.com这一点现在阻止Safari浏览器的用户登录,除非他们明确自己的饼干。问题的根源在于为这两个域设置了Cookie设置为sessionid如何清除旧SESSION_COOKIE_DOMAIN饼干在Django

有没有办法来清除或忽略原来的域名或是唯一的方法来建议用户清除cookie?

回答

7

SESSION_COOKIE_DOMAIN设置被修改时会发生这种情况。 (你说SESSION_COOKE_PATH已更改)。

SESSION_COOKIE_DOMAIN的文档附带了这样的警告:

SESSION_COOKIE_DOMAIN

更新在生产现场此设置时一定要小心。如果您 更新了此设置,以启用以前使用标准域Cookie的站点上的跨域Cookie,现有用户Cookie将设置为旧域的 。这可能导致他们无法登录 ,只要这些cookies持续存在。

如果从去就会发生这种情况:

SESSION_COOKIE_DOMAIN = None 

SESSION_COOKIE_DOMAIN = '.domain.com' 

正如你所说,现在有在客户端两个cookie将被发送到服务器在请求期间,这两个cookie名为sessionid。当Django查看cookie时,它只能访问Python字典,因此只能看到一个sessionid cookie,而不是两个都发送的cookie。

我没有测试过这一点,但一些想法解决问题可能是:

  • 要求用户删除相应的cookie。根据用户数量和他们的技能水平,这可能不是一个合理的选择。要求他们删除所有的cookies可能是不可能的。

  • 等待旧的cookies过期。默认情况下,看起来好像sessionid Cookie有14天到期。一旦旧会话cookie过期,它们将不再随每个请求一起发送,从而允许新的sessionid cookie生效。

  • 更改sessionid cookie的名称并编写自定义Django中间件来处理旧的和新的sessionid Cookie。

我没有测试的最后一点,但它应该是可能的SESSION_COOKIE_NAME更改为sessionid其他的东西。现在,这将阻止现有登录用户使用其现有的sessionid Cookie,因此您需要编写一个自定义中间件,该中间件能够处理sessionid Cookie(旧Cookie)和sessionidnew当前登录的Cookie。

像这样将工作:

from django.utils.importlib import import_module 
from django.contrib.sessions import middleware 
from django.conf import settings 

class MySessionMiddleware(middleware.SessionMiddleware): 
    def process_request(self, request): 
     engine = import_module(settings.SESSION_ENGINE) 
     session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None) 
     if session_key is None: 
      # Look for old cookie in request for auth purposes. 
      session_key = request.COOKIES.get('sessionid', None) 
     request.session = engine.SessionStore(session_key) 

你必须用这个新的中间件,以取代settings.pySessionMiddlewareMIDDLEWARE_CLASSES下。如:更改'django.contrib.sessions.middleware.SessionMiddleware''custommiddleware.MySessionMiddleware'其中custommiddleware.py是与上面的代码的文件,并出现在你的项目的根文件夹(其中manage.py文件存在)

一旦有足够的时间已经过去了,你确信所有的旧的sessionid Cookie已过期,您可以执行相反操作并更改为使用sessionid作为会话的首选cookie名称,最终删除可处理两种不同类型的sessionid Cookie的专用代码。

+1

是的,我的意思是'''SESSION_COOKIE_DOMAIN''',错误地输入为'''SESSION_COOKIE_PATH'''。更改会话cookie名称是一个巧妙的技巧,可以在这种情况下工作。感谢您指出! – jorilallo 2013-04-02 21:38:49