Как получить уникальных пользователей через несколько сайтов Django, приводимых в действие платформой “сайтов”?

Когда я перехожу к панели управления своего webhost, открываю phpMyAdmin и нажимаю на "Show MySQL runtime information", я добираюсь:

Этот сервер MySQL работал в течение 53 дней, 15 часов, 28 минут и 53 секунд. Это запустило 24 октября 2008 в 4:03.

статистика Запроса: Начиная с его запуска 3,444,378,344 запроса были отправлены на сервер.

Общие 3 444 M
в час 2,68 M
в минуту 44,59 k
в секунду 743.13

Это - в среднем 743 запроса MySQL каждую секунду в течение прошлых 53 дней!

я не знаю о Вас, но мне это быстро! Очень быстро!!

25
задан westmark 10 September 2009 в 08:46
поделиться

3 ответа

Самый большой совместимый способ сделать это - создать модель профиля пользователя , которая включает внешний ключ для модели сайта, а затем написать настраиваемый бэкэнд аутентификации , который проверяет текущий сайт на значение что ФК. Пример кода:

Определите модель своего профиля, скажем, в 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. (Спасибо Яну Вробелю за указание на необходимость обработки последнего случая.)

s говорят в 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. (Спасибо Яну Вробелю за указание на необходимость обработки последнего случая.)

s говорят в 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. (Спасибо Яну Вробелю за указание на необходимость обработки последнего случая.)

Переопределенный метод Authenticate гарантирует, что пользователь может войти только на правильный сайт. Метод get_user вызывается при каждом запросе для выборки пользователя из базы данных на основе сохраненной информации аутентификации в сеансе пользователя; наше переопределение гарантирует, что пользователь не сможет войти на сайт A, а затем использовать тот же файл cookie сеанса для получения несанкционированного доступа к сайту B. (Спасибо Яну Вробелю за указание на необходимость обработки последнего случая.)

Переопределенный метод Authenticate гарантирует, что пользователь может войти только на правильный сайт. Метод get_user вызывается при каждом запросе для выборки пользователя из базы данных на основе сохраненной информации аутентификации в пользовательском сеансе; наше переопределение гарантирует, что пользователь не сможет войти на сайт A, а затем использовать тот же файл cookie сеанса для получения несанкционированного доступа к сайту B. (Спасибо Яну Вробелю за указание на необходимость обработки последнего случая.)

27
ответ дан 28 November 2019 в 21:42
поделиться

Вы должны знать, что многие люди жалуются на систему авторизации и привилегии Django по умолчанию - в ней просто правила для объектов, для экземпляров объектов - какие это означает, что без написания кода это было бы невозможно.

Однако есть несколько хуков авторизации, которые могут помочь вам в достижении этой цели, например:

Посмотрите здесь: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py и для класса Permission.

Вы можете добавить свое собственное разрешение и определить для них правила (есть ForeignKey для User и ContentType).

Однако2 без обезьяньего исправления / изменения некоторых методов это может быть затруднено.

-1
ответ дан 28 November 2019 в 21:42
поделиться

Вы можете подключить свои собственные серверы авторизации и аутентификации, которые принимают во внимание идентификатор сайта.

См. другие источники аутентификации в документации django и ссылки на бэкенды аутентификации

Кроме того, если ваш исходный код django слишком старый, вы всегда можете изменить код Authenticate () или login () самостоятельно. В конце концов ... Разве это не одно из чудес открытого кода. Имейте в виду, что это может повлиять на совместимость с другими модулями.

Надеюсь, это поможет.

3
ответ дан 28 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: