Не могли бы вы объяснить, как «django.contrib.auth» работает для меня, пожалуйста?

#django

#django

Вопрос:

Я работаю над модулем аутентификации, вдохновляясь и заменяя «django.contrib.auth».

Что они делают со всем этим и почему?

 def get_user(request):
  from django.contrib.auth.models import AnonymousUser
  try:
    user_id = request.session[SESSION_KEY]
    backend_path = request.session[BACKEND_SESSION_KEY]
    backend = load_backend(backend_path)
    user = backend.get_user(user_id) or AnonymousUser()
  except KeyError:
    user = AnonymousUser()
  return user

class LazyUser(object):
  def __get__(self, request, obj_type=None):
    if not hasattr(request, '_cached_user'):
        from django.contrib.auth import get_user
        request._cached_user = get_user(request)
    return request._cached_user

class AuthenticationMiddleware(object):
  def process_request(self, request):
    assert hasattr(request, 'session'), "The Django authentication ..."
    request.__class__.user = LazyUser()
    return None
  
  • Пытается ли это предотвратить попадание в базу данных для экземпляра пользователя при каждом запросе?
  • Устаревает ли он, если пользовательская запись изменена?
  • Почему они просто не сохраняют экземпляр пользователя или ключ к нему в сеансе?
  • почему присваивать request.__class__.user , а не просто request.user ?

Я бы добавил процедуры аутентификации, входа и выхода из системы, но не хочу утомлять вас слишком большим количеством дампов кода. Я думаю, что теперь я понял (этот последний вопрос может быть ключевым), но только заставив себя изложить вопрос (несколько) разумно 🙂

Ответ №1:

  1. Нет. Он запрашивает пользователя не более одного раза за запрос, но не охватывает запросы.
  2. ДА.
  3. Они работают. Сохранить PK.
  4. Чтобы он стал атрибутом класса request (в отличие от атрибута экземпляра), что позволяет ему корректно работать как дескриптор.

Комментарии:

1. Почему в сеанс помещается только ключ, а не весь пользовательский объект?

2. Потому что поместить весь объект в сеанс непросто, плюс (хотя это случается очень, очень редко) весь класс, используемый для пользователя, может измениться под ним, что приведет к странным ошибкам.

3. Я думаю, что это также из-за проблем безопасности, связанных с сеансом.

4. Как так? PK — это все, что нужно для идентификации пользователя.

5. Во-первых, это не случайное хэш-значение, которое вводится в сеанс, а не первичный ключ. Кто-то может захватить или подделать (cookie-подделка) информацию в вашем сеансе, что может вызвать потенциальную проблему.