Введение в пользовательскую систему Django
Пользователи из коробки
В 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
Чем аутентификация отличается от авторизации?
Создайте в shell пользователя anna с email anna@example.com и паролем Secret123!
так, чтобы пароль был захэширован. Сохраните объект в переменную user.
user = User.objects.create_user("anna", "anna@example.com", "Secret123!")
Как Django хранит пароли пользователей?
Какие поля есть у встроенной модели User?
Как в шаблоне проверить, что пользователь вошёл на сайт? Напишите открывающий тег if.
{% if user.is_authenticated %}Какой строкой проверить, что у пользователя есть право добавлять посты в приложении blog?
Войдите, чтобы отмечать пройденные уроки.