Введение в пользовательскую систему Django

⏱ 20 мин · 🧩 заданий: 6

Пользователи из коробки

В Django встроено приложение django.contrib.auth — полноценная система пользователей. Оно уже подключено в INSTALLED_APPS любого нового проекта и даёт:

  • модель пользователя User;
  • безопасное хэширование паролей;
  • группы и права доступа;
  • готовые представления и формы: вход, выход, смена и восстановление пароля;
  • middleware, которое добавляет к каждому запросу request.user.

Именно эту систему использует сайт, на котором вы учитесь: регистрация, вход и сохранение прогресса построены на django.contrib.auth.

Аутентификация и авторизация

  • Аутентификация (authentication) — «кто вы?». Пользователь доказывает, что он — это он (логин и пароль).
  • Авторизация (authorization) — «что вам можно?». Проверка прав: может ли этот пользователь редактировать пост.

Модель User

from django.contrib.auth.models import User
Поле Описание
username Уникальное имя для входа
password Хэш пароля
email Email (не уникален по умолчанию!)
first_name, last_name Имя и фамилия
is_active Может ли входить (вместо удаления — деактивация)
is_staff Есть ли доступ в админку
is_superuser Все права без явного назначения
last_login, date_joined Даты

Создание пользователей

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user("anna", "anna@example.com", "Secret123!")
>>> admin = User.objects.create_superuser("boss", "boss@example.com", "VerySecret1!")

Никогда не create()

User.objects.create(username="anna", password="Secret123!") сохранит пароль открытым текстом, и войти с ним не получится. Используйте create_user() или user.set_password().

Пароли

Django не хранит пароли — только хэш с солью:

pbkdf2_sha256$870000$Kf3x...$Wd0N...
алгоритм      итерации соль     хэш
>>> user.password
'pbkdf2_sha256$870000$...'
>>> user.check_password("Secret123!")
True
>>> user.set_password("NewPass456!")
>>> user.save()

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

request.user

AuthenticationMiddleware добавляет к каждому запросу текущего пользователя:

def profile(request):
    if request.user.is_authenticated:
        return HttpResponse(f"Привет, {request.user.username}!")
    return HttpResponse("Вы не вошли")

Для анонимного посетителя request.user — объект AnonymousUser с is_authenticated == False.

В шаблонах переменная user доступна всегда (контекстный процессор auth):

{% if user.is_authenticated %}
  Привет, {{ user.get_full_name|default:user.username }}!
{% else %}
  <a href="{% url 'login' %}">Войти</a>
{% endif %}

Права и группы

Для каждой модели Django автоматически создаёт четыре права: add, change, delete, view. Например, для Post из blog: blog.add_post, blog.change_post, blog.delete_post, blog.view_post.

user.has_perm("blog.change_post")      # True / False
user.has_perms(["blog.add_post", "blog.change_post"])

Группы объединяют права: создайте в админке группу «Редакторы» с правами на посты и добавляйте в неё пользователей.

from django.contrib.auth.models import Group

editors = Group.objects.get(name="Редакторы")
user.groups.add(editors)

Свои права можно объявить в модели:

class Post(models.Model):
    ...

    class Meta:
        permissions = [("publish_post", "Может публиковать посты")]

Функции аутентификации

from django.contrib.auth import authenticate, login, logout

user = authenticate(request, username="anna", password="Secret123!")  # User или None
if user is not None:
    login(request, user)      # создаёт сессию
logout(request)               # завершает сессию

Обычно их не вызывают вручную — Django предоставляет готовые view. О них — в следующем уроке.

Итог

  • django.contrib.auth — пользователи, пароли, группы, права, готовые view.
  • Пароли хранятся хэшами; создаём через create_user(), меняем через set_password().
  • request.user и user в шаблоне — текущий пользователь, is_authenticated — вошёл ли он.
  • Права app.action_model проверяются через has_perm().

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Один вариант ответа

Чем аутентификация отличается от авторизации?

Задание 2 Написать код

Создайте в shell пользователя anna с email anna@example.com и паролем Secret123! так, чтобы пароль был захэширован. Сохраните объект в переменную user.

Задание 3 Один вариант ответа

Как Django хранит пароли пользователей?

Задание 4 Несколько вариантов

Какие поля есть у встроенной модели User?

Задание 5 Ввод ответа

Как в шаблоне проверить, что пользователь вошёл на сайт? Напишите открывающий тег if.

Задание 6 Один вариант ответа

Какой строкой проверить, что у пользователя есть право добавлять посты в приложении blog?

Войдите, чтобы отмечать пройденные уроки.