Наиболее совместимый способ сделать это - создать модель профиля пользователя , которая включает внешний ключ к модели сайта, а затем написать настраиваемый аутентификационный бэкэнд , который проверяет текущий сайт против стоимости этого ФК. Пример кода:
Определите модель своего профиля, скажем, в app / models.py:
from django.db import models
from django.contrib.sites.models import Site
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
site = models.ForeignKey(Site)
Напишите свой собственный аутентификационный бэкэнд, наследуя от стандартного, скажем, в app / auth_backend.py:
from django.contrib.auth.backends import ModelBackend
from django.contrib.sites.models import Site
class SiteBackend(ModelBackend):
def authenticate(self, **credentials):
user_or_none = super(SiteBackend, self).authenticate(**credentials)
if user_or_none and user_or_none.userprofile.site != Site.objects.get_current():
user_or_none = None
return user_or_none
def get_user(self, user_id):
try:
return User.objects.get(
pk=user_id, userprofile__site=Site.objects.get_current())
except User.DoesNotExist:
return None
Этот аутентификационный бэкэнд предполагает, что все пользователи имеют профиль; вам нужно убедиться, что процесс создания / регистрации пользователя всегда создает его.
Переопределенный метод authenticate
гарантирует, что пользователь может войти только на правильный сайт. Метод get_user
вызывается при каждом запросе для извлечения пользователя из базы данных на основе сохраненной информации аутентификации в сеансе пользователя; наше переопределение гарантирует, что пользователь не сможет войти на сайт A, а затем использовать тот же файл cookie сеанса для получения несанкционированного доступа к сайту B. (Спасибо Ян Вробель за указание на необходимость обработки последнего случая.)