2013-03-25 2 views
4

Недавно мы изменили наш домен куки (settings.SESSION_COOKIE_DOMAIN) от domain.com к .domain.com и теперь это запретить пользователям Safari от входа в них, если не очистить их печенье. Проблема связана с тем, что для обоих доменов установлено sessionid.Как очистить куки для старого SESSION_COOKIE_DOMAIN в Django

Есть ли способ очистить или игнорировать исходный домен или является единственным способом советовать пользователям очищать файлы cookie?

ответ

7

Это может произойти при изменении настройки SESSION_COOKIE_DOMAIN. (Вы указали, что SESSION_COOKE_PATH было изменено).

Документация SESSION_COOKIE_DOMAIN приходит с этим предупреждением:

SESSION_COOKIE_DOMAIN

Будьте осторожны при обновлении этого параметра на производственной площадке. Если вы установили , чтобы разрешить использование междоменных куки-файлов на сайте, которые ранее использовали стандартные куки-файлы домена, существующие файлы cookie домена будут установлены в старый домен. Это может привести к тому, что они не смогут войти в систему , пока эти куки сохраняются.

Это может произойти, если вы пошли с:

SESSION_COOKIE_DOMAIN = None 

в

SESSION_COOKIE_DOMAIN = '.domain.com' 

Как вы уже говорилось, в настоящее время существует два печенья на стороне клиента, которые будут отправлены в сервера во время запроса, оба файла cookie с именем sessionid. Когда Django просматривает файлы cookie, он имеет доступ только к словарю Python, поэтому он видит только один файл cookie sessionid, а не тот, который был отправлен.

Я не проверял, но некоторые идеи для крепления проблем могут быть:

  • Попросите пользователь удалить соответствующий куки. В зависимости от количества пользователей и уровня их квалификации это может быть не разумным вариантом. Попросить их удалить ВСЕ их файлы cookie может быть и речи.

  • Подождите, пока старые куки исчезнут. По умолчанию, похоже, что cookie sessionid имеет 14-дневный срок действия. Как только старые файлы cookie сеанса истекают, они больше не будут отправляться с каждым запросом, позволяя новому cookie sessionid вступить в силу.

  • Измените имя cookie sessionid и напишите собственное промежуточное программное обеспечение Django, чтобы обрабатывать как старые, так и новые файлы cookie sessionid.

Я не тестировал последнюю точку, но это должно быть возможно изменить SESSION_COOKIE_NAME к чему-то другому, чем sessionid.Теперь это позволит запретить существующим зарегистрированным пользователям использовать их существующие файлы cookie sessionid, поэтому вам нужно будет написать собственное промежуточное программное обеспечение, которое могло бы обрабатывать как cookie sessionid (для старых файлов cookie), так и sessionidnew куки для текущих входов в систему.

Что-то, как это будет работать:

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) 

Вы должны были бы заменить SessionMiddleware в settings.py под MIDDLEWARE_CLASSES с этим новым ППО. Например: Изменение 'django.contrib.sessions.middleware.SessionMiddleware' в 'custommiddleware.MySessionMiddleware' где custommiddleware.py находится файл с кодом выше и присутствует в корневой папке проекта (где manage.py файл присутствует)

После достаточно времени прошло, и вы будете удовлетворены, что все старые cookie sessionid истекли, вы можете сделать обратное и вернуться к использованию sessionid в качестве предпочтительного имени cookie для сеансов, в результате чего удалите код специалиста, который может обрабатывать два разных типа файлов cookie sessionid.

+1

Да, я имел в виду '' '' SESSION_COOKIE_DOMAIN''', опечатал его как '' '' SESSION_COOKIE_PATH'''. Изменение имени cookie сеанса - это аккуратный трюк и будет работать в этом случае. Спасибо, что указали! – jorilallo

Смежные вопросы