Использование системы аутентификации Django
Этот документ объясняет использование системы аутентификации Django в её стандартной конфигурации. Эта конфигурация эволюционировала, чтобы удовлетворить наиболее распространённые потребности проектов, обрабатывая широкий спектр задач и имея продуманную реализацию паролей и разрешений. Для проектов, где потребности в аутентификации отличаются от стандартных, Django поддерживает расширенную настройку и расширение аутентификации.
Система аутентификации Django предоставляет как аутентификацию, так и авторизацию вместе и обычно называется системой аутентификации, поскольку эти функции несколько связаны.
User объекты
User объекты являются основой системы аутентификации. Они обычно представляют людей, взаимодействующих с вашим сайтом, и используются для таких задач, как ограничение доступа, регистрация пользовательских профилей, привязка контента к создателям и т. д. В рамках фреймворка аутентификации Django существует только один класс пользователей, т. е. 'superusers' или администраторские 'staff' пользователи — это просто объекты пользователей со специальными атрибутами, а не разные классы объектов пользователей.
Основные атрибуты стандартного пользователя:
См. full API documentation для полной справки, приведенная далее документация ориентирована на конкретные задачи.
Создание пользователей
Самый прямой способ создания пользователей — использование встроенной функции create_user():
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()
Если у вас установлен Django админ-панель, вы также можете создать пользователей интерактивно.
Создание суперпользователей
Создайте суперпользователей, используя команду createsuperuser:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
Вам будет предложено ввести пароль. После ввода, пользователь будет создан сразу. Если вы опустите опцию --username или --email, вам будет предложено ввести эти значения.
Изменение паролей
Django не хранит исходные (открытые) пароли в модели пользователя, а только хэш (см. документацию по управлению паролями для получения полной информации). По этой причине не пытайтесь напрямую изменять атрибут пароля пользователя. Именно поэтому при создании пользователя используется вспомогательная функция.
Чтобы изменить пароль пользователя, у вас есть несколько вариантов:
manage.py changepassword *username* предлагает способ изменения пароля пользователя из командной строки. Вам будет предложено изменить пароль указанного пользователя, который вы должны ввести дважды. Если они совпадут, новый пароль будет изменён сразу. Если вы не укажете пользователя, команда попытается изменить пароль пользователя, имя которого соответствует текущему имени пользователя системы.
Вы также можете изменить пароль программно, используя set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
Если у вас установлен Django админ-панель, вы также можете изменить пароли пользователей на страницах администрирования системы аутентификации системы аутентификации.
Django также предоставляет представления и формы, которые могут использоваться для того, чтобы пользователи могли самостоятельно менять свои пароли.
Изменение пароля пользователя приведет к выходу всех его сессий. См. Инвалидация сессии при изменении пароля для получения подробностей.
Аутентификация пользователей
-
authenticate(request=None, **credentials)[source] -
Используйте
authenticate()для проверки набора данных. Она принимает данные в качестве ключевых аргументов,usernameиpasswordв стандартном случае, сравнивает их с каждым аутентификационным бэкендом и возвращает объектUser, если данные валидны для бэкенда. Если данные не валидны для любого бэкенда или бэкенд вызываетPermissionDenied, он возвращаетNone. Например:from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None: # A backend authenticated the credentials else: # No backend authenticated the credentialsrequest— это необязательныйHttpRequest, который передаётся в методauthenticate()аутентификационных бэкендов.Изменено в Django 1.11:Был добавлен необязательный аргумент
request.Примечание
Это низкоуровневый способ аутентификации набора данных; например, он используется
RemoteUserMiddleware. Если вы не пишете собственную систему аутентификации, вы, скорее всего, этим не воспользуетесь. Вместо этого, если вы ищете способ входа пользователя, используйтеLoginView.
Разрешения и авторизация
Она используется сайтом Django admin, но вы можете использовать её в собственном коде.
Сайт Django admin использует разрешения следующим образом:
- Доступ к форме «Добавить» и добавление объекта ограничен пользователями с разрешением «Добавить» для этого типа объекта.
- Доступ к просмотру списка изменений, просмотру формы «Изменить» и изменению объекта ограничен пользователями с разрешением «Изменить» для этого типа объекта.
- Доступ к удалению объекта ограничен пользователями с разрешением «Удалить» для этого типа объекта.
Разрешения могут быть заданы не только для типа объекта, но и для конкретного экземпляра объекта. Используя методы has_add_permission(), has_change_permission() и has_delete_permission(), предоставляемые классом ModelAdmin, можно настроить разрешения для различных экземпляров объектов одного типа.
User объекты имеют два поля «многие ко многим»: groups и user_permissions. User объекты могут получить доступ к связанным объектам так же, как и любой другой модель Django:
myuser.groups.set([group_list]) myuser.groups.add(group, group, ...) myuser.groups.remove(group, group, ...) myuser.groups.clear() myuser.user_permissions.set([permission_list]) myuser.user_permissions.add(permission, permission, ...) myuser.user_permissions.remove(permission, permission, ...) myuser.user_permissions.clear()
Стандартные разрешения
Когда django.contrib.auth указан в настройке INSTALLED_APPS, он гарантирует, что для каждой модели Django, определённой в одном из ваших установленных приложений, создаются три стандартных разрешения — «добавить», «изменить» и «удалить».
Эти разрешения будут созданы при запуске manage.py migrate; при первом запуске migrate после добавления django.contrib.auth в INSTALLED_APPS, стандартные разрешения будут созданы для всех ранее установленных моделей, а также для любых новых моделей, устанавливаемых в данный момент. После этого, он будет создавать стандартные разрешения для новых моделей каждый раз при запуске manage.py migrate (функция, создающая разрешения, подключена к сигналу post_migrate).
Предполагая, что у вас есть приложение с app_label foo и моделью под названием Bar, для проверки базовых разрешений следует использовать:
- добавить:
user.has_perm('foo.add_bar') - изменить:
user.has_perm('foo.change_bar') - удалить:
user.has_perm('foo.delete_bar')
Модель Permission редко используется напрямую.
Группы
django.contrib.auth.models.Group модели представляют собой универсальный способ категоризации пользователей, чтобы вы могли применять разрешения или какие-либо другие метки к этим пользователям. Пользователь может принадлежать к любому количеству групп.
Пользователь в группе автоматически получает разрешения, предоставленные этой группе. Например, если группа Site editors имеет разрешение can_edit_home_page, любой пользователь в этой группе будет иметь это разрешение.
Помимо разрешений, группы являются удобным способом категоризации пользователей для присвоения им меток или расширенных функций. Например, вы можете создать группу 'Special users', и вы можете написать код, который, скажем, предоставит им доступ к закрытой для членов части вашего сайта или отправит им закрытые для членов электронные письма.
Программное создание разрешений
Хотя настраиваемые разрешения могут быть определены в классе Meta модели, вы также можете создавать разрешения напрямую. Например, вы можете создать разрешение can_publish для модели BlogPost в myapp.
from myapp.models import BlogPost
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(
codename='can_publish',
name='Can Publish Posts',
content_type=content_type,
)
Затем разрешение можно назначить пользователю User через его атрибут user_permissions или группе Group через её атрибут permissions.
Кэширование разрешений
Backend ModelBackend кэширует разрешения в объекте пользователя после первого обращения к ним для проверки разрешений. Как правило, это нормально для цикла запрос-ответ, так как разрешения обычно не проверяются сразу после их добавления (например, в админке). Если вы добавляете разрешения и сразу же их проверяете, например, в тесте или представлении, самый простой способ — повторно получить пользователя из базы данных. Например:
from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404
from myapp.models import BlogPost
def user_gains_perms(request, user_id):
user = get_object_or_404(User, pk=user_id)
# any permission check will cache the current set of permissions
user.has_perm('myapp.change_blogpost')
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.get(
codename='change_blogpost',
content_type=content_type,
)
user.user_permissions.add(permission)
# Checking the cached permission set
user.has_perm('myapp.change_blogpost') # False
# Request new instance of User
# Be aware that user.refresh_from_db() won't clear the cache.
user = get_object_or_404(User, pk=user_id)
# Permission cache is repopulated from the database
user.has_perm('myapp.change_blogpost') # True
...
Аутентификация в веб-запросах
Django использует сессии и мидлварь для подключения системы аутентификации к request objects.
Эти объекты предоставляют атрибут request.user в каждом запросе, представляющий текущего пользователя. Если текущий пользователь не вошел в систему, этот атрибут будет установлен на экземпляр AnonymousUser, в противном случае — на экземпляр User.
Вы можете отличить их с помощью is_authenticated, как показано ниже:
if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
Как войти в систему пользователю
Если у вас есть аутентифицированный пользователь, которого вы хотите прикрепить к текущей сессии, это делается с помощью функции login().
-
login(request, user, backend=None)[source] -
Чтобы войти в систему пользователя из представления, используйте
login(). Она принимает объектHttpRequestи объектUser.login()сохраняет идентификатор пользователя в сессии, используя фреймворк сессий Django.Обратите внимание, что любые данные, заданные во время анонимной сессии, сохраняются в сессии после входа в систему пользователем.
Этот пример показывает, как вы можете использовать как
authenticate(), так иlogin():from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. ... else: # Return an 'invalid login' error message. ...
Выбор бэкенда аутентификации
При входе пользователя в систему идентификатор пользователя и используемый бэкенд аутентификации сохраняются в сессии пользователя. Это позволяет одному и тому же бэкенду аутентификации получать данные пользователя при последующих запросах. Бэкенд аутентификации для сохранения в сессии выбирается следующим образом:
- Используйте значение необязательного аргумента
backend, если он предоставлен. - Используйте значение атрибута
user.backend, если он присутствует. Это позволяет сопоставитьauthenticate()иlogin():authenticate()устанавливает атрибутuser.backendв объекте пользователя, который он возвращает. - Используйте значение
backendвAUTHENTICATION_BACKENDS, если существует только один. - В противном случае, вызовите исключение.
В случаях 1 и 2 значение аргумента backend или атрибута user.backend должно быть строкой импорта с точкой (как в AUTHENTICATION_BACKENDS), а не фактическим классом бэкенда.
Как выйти из системы пользователю
-
logout(request)[source] -
Чтобы выйти из системы пользователя, вошедшего в систему через
django.contrib.auth.login(), используйтеdjango.contrib.auth.logout()в своем представлении. Она принимает объектHttpRequestи не имеет значения возврата. Пример:from django.contrib.auth import logout def logout_view(request): logout(request) # Redirect to a success page.Обратите внимание, что
logout()не генерирует ошибок, если пользователь не был авторизован.При вызове
logout(), данные сессии для текущего запроса полностью очищаются. Все существующие данные удаляются. Это предотвращает использование того же веб-браузера другим пользователем для входа в систему и доступа к данным сессии предыдущего пользователя. Если вы хотите поместить что-либо в сессию, которое будет доступно пользователю сразу после выхода из системы, сделайте это после вызоваdjango.contrib.auth.logout().
Ограничение доступа для авторизованных пользователей
Прямой способ
Простой, прямой способ ограничения доступа к страницам — это проверка request.user.is_authenticated и переадресация на страницу входа:
from django.conf import settings
from django.shortcuts import redirect
def my_view(request):
if not request.user.is_authenticated:
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
# ...
…или вывод сообщения об ошибке:
from django.shortcuts import render
def my_view(request):
if not request.user.is_authenticated:
return render(request, 'myapp/login_error.html')
# ...
Декоратор login_required
-
login_required(redirect_field_name='next', login_url=None)[source] -
В качестве сокращения можно использовать удобный декоратор
login_required():from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...login_required()выполняет следующие действия:- Если пользователь не авторизован, перенаправить его на
settings.LOGIN_URL, передав текущий абсолютный путь в строке запроса. Пример:/accounts/login/?next=/polls/3/. - Если пользователь авторизован, выполнить представление обычно. Код представления может свободно предполагать, что пользователь авторизован.
По умолчанию, путь, на который пользователь должен быть перенаправлен после успешной аутентификации, хранится в параметре строки запроса, называемом
"next". Если вы предпочитаете использовать другое имя для этого параметра, декораторlogin_required()принимает необязательный параметрredirect_field_name.from django.contrib.auth.decorators import login_required @login_required(redirect_field_name='my_redirect_field') def my_view(request): ...Обратите внимание, что если вы предоставите значение параметру
redirect_field_name, вам, скорее всего, потребуется также настроить шаблон входа в систему, так как переменная контекста шаблона, которая хранит путь перенаправления, будет использовать значение параметраredirect_field_nameв качестве ключа вместо"next"(по умолчанию).login_required()также принимает необязательный параметрlogin_url. Пример:from django.contrib.auth.decorators import login_required @login_required(login_url='/accounts/login/') def my_view(request): ...Обратите внимание, что если вы не укажете параметр
login_url, вам нужно убедиться, чтоsettings.LOGIN_URLи ваше представление для входа в систему должным образом связаны. Например, используя значения по умолчанию, добавьте следующие строки в ваш файл URLconf:from django.contrib.auth import views as auth_views path('accounts/login/', auth_views.LoginView.as_view()),settings.LOGIN_URLтакже принимает имена функций представления и имена URL-паттернов. Это позволяет свободно переназначать ваше представление для входа в систему в файле URLconf, без необходимости обновления настройки. - Если пользователь не авторизован, перенаправить его на
Примечание
Декоратор login_required не проверяет флаг is_active пользователя, но по умолчанию AUTHENTICATION_BACKENDS отклоняет неактивных пользователей.
См. также
Если вы пишете пользовательские представления для админпанели Django (или вам нужна та же проверка авторизации, что и в встроенных представлениях), вы можете найти декоратор django.contrib.admin.views.decorators.staff_member_required() полезной альтернативой login_required().
Миксин LoginRequired
При использовании представлений на основе классов, вы можете добиться такого же поведения, что и с login_required, используя LoginRequiredMixin. Этот миксин должен стоять в крайнем левом положении в списке наследования.
-
class LoginRequiredMixin -
Если представление использует этот миксин, все запросы от неавторизованных пользователей будут перенаправлены на страницу входа в систему или отобразят ошибку HTTP 403 Forbidden, в зависимости от параметра
raise_exception.Вы можете установить любой из параметров
AccessMixin, чтобы настроить обработку неавторизованных пользователей:from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = '/login/' redirect_field_name = 'redirect_to'
Примечание
Так же, как и декоратор login_required, этот миксин не проверяет флаг is_active пользователя, но по умолчанию AUTHENTICATION_BACKENDS отклоняет неактивных пользователей.
Ограничение доступа для авторизованных пользователей, прошедших тест
Чтобы ограничить доступ на основе определенных разрешений или какого-либо другого теста, вы сделаете по существу то же самое, что описано в предыдущем разделе.
Простой способ — запустить ваш тест на request.user непосредственно в представлении. Например, это представление проверяет, есть ли у пользователя электронная почта в желаемом домене, и если нет, перенаправляет его на страницу входа в систему:
from django.shortcuts import redirect
def my_view(request):
if not request.user.email.endswith('@example.com'):
return redirect('/login/?next=%s' % request.path)
# ...
-
user_passes_test(test_func, login_url=None, redirect_field_name='next')[source] -
В качестве сокращения можно использовать удобный декоратор
user_passes_test, который выполняет перенаправление, когда вызываемый объект возвращает значениеFalse.from django.contrib.auth.decorators import user_passes_test def email_check(user): return user.email.endswith('@example.com') @user_passes_test(email_check) def my_view(request): ...user_passes_test()принимает обязательный аргумент: вызываемый объект, который принимает объектUserи возвращает значениеTrue, если пользователю разрешено просматривать страницу. Обратите внимание, чтоuser_passes_test()не автоматически проверяет, чтоUserне анонимный.user_passes_test()принимает два необязательных аргумента:-
login_url - Позволяет указать URL, на который будут перенаправлены пользователи, которые не прошли тест. Это может быть страница входа в систему, по умолчанию
settings.LOGIN_URL, если вы не укажете значение. -
redirect_field_name - То же самое, что и для
login_required(). Установка значения вNoneудаляет его из URL, что может потребоваться, если вы перенаправляете пользователей, которые не прошли тест, на страницу без входа в систему, где нет параметра «следующей страницы».
Например:
@user_passes_test(email_check, login_url='/login/') def my_view(request): ... -
-
class UserPassesTestMixin -
При использовании представлений на основе классов, вы можете использовать
UserPassesTestMixin, чтобы сделать это.-
test_func() -
Вы должны переопределить метод
test_func()класса, чтобы предоставить тест, который будет выполняться. Кроме того, вы можете установить любой из параметровAccessMixin, чтобы настроить обработку неавторизованных пользователей:from django.contrib.auth.mixins import UserPassesTestMixin class MyView(UserPassesTestMixin, View): def test_func(self): return self.request.user.email.endswith('@example.com')
-
get_test_func() -
Вы также можете переопределить метод
get_test_func(), чтобы миксин использовал функцию с другим именем для своих проверок (вместоtest_func()).
Укладка
UserPassesTestMixinИз-за того, как реализован
UserPassesTestMixin, вы не можете укладывать их в списке наследования. Следующее не работает:class TestMixin1(UserPassesTestMixin): def test_func(self): return self.request.user.email.endswith('@example.com') class TestMixin2(UserPassesTestMixin): def test_func(self): return self.request.user.username.startswith('django') class MyView(TestMixin1, TestMixin2, View): ...Если
TestMixin1вызывал быsuper()и учитывал бы этот результат,TestMixin1больше не работал бы автономно. -
Декоратор permission_required
-
permission_required(perm, login_url=None, raise_exception=False)[source] -
Это относительно распространённая задача — проверить, обладает ли пользователь определённым разрешением. По этой причине Django предоставляет сокращение для этого случая: декоратор
permission_required().from django.contrib.auth.decorators import permission_required @permission_required('polls.can_vote') def my_view(request): ...Так же, как и метод
has_perm(), имена разрешений имеют вид"<app label>.<permission codename>"(например,polls.can_voteдля разрешения на модель в приложенииpolls).Декоратор также может принимать итерируемый список разрешений, в этом случае пользователь должен обладать всеми разрешениями, чтобы получить доступ к представлению.
Обратите внимание, что
permission_required()также принимает необязательный параметрlogin_url:from django.contrib.auth.decorators import permission_required @permission_required('polls.can_vote', login_url='/loginpage/') def my_view(request): ...Как и в декораторе
login_required(), параметрlogin_urlпо умолчанию равенsettings.LOGIN_URL.Если параметр
raise_exceptionзадан, декоратор вызоветPermissionDenied, что вызовет отображение страницы 403 (HTTP Forbidden) вместо перенаправления на страницу входа в систему.Если вы хотите использовать
raise_exception, но также дать пользователям возможность сначала войти в систему, вы можете добавить декораторlogin_required():from django.contrib.auth.decorators import login_required, permission_required @login_required @permission_required('polls.can_vote', raise_exception=True) def my_view(request): ...Это также предотвращает цикл перенаправления, когда у
LoginView’sredirect_authenticated_user=Trueи у авторизованного пользователя нет всех необходимых разрешений.
Mixin PermissionRequiredMixin
Для применения проверок разрешений к классовым представлениям можно использовать PermissionRequiredMixin:
-
class PermissionRequiredMixin -
Этот миксин, подобно декоратору
permission_required, проверяет, обладает ли пользователь, обращающийся к представлению, всеми указанными разрешениями. Разрешение (или итерируемый список разрешений) следует указать с помощью параметраpermission_required:from django.contrib.auth.mixins import PermissionRequiredMixin class MyView(PermissionRequiredMixin, View): permission_required = 'polls.can_vote' # Or multiple of permissions: permission_required = ('polls.can_open', 'polls.can_edit')Вы можете установить любые параметры
AccessMixin, чтобы настроить обработку неавторизованных пользователей.Вы также можете переопределить эти методы:
-
get_permission_required() -
Возвращает итерируемый список имён разрешений, используемых миксином. По умолчанию возвращает атрибут
permission_required, преобразуя его в кортеж при необходимости.
-
has_permission() -
Возвращает логическое значение, указывающее, имеет ли текущий пользователь разрешение на выполнение декорированного представления. По умолчанию возвращает результат вызова
has_perms()со списком разрешений, возвращаемым методомget_permission_required().
-
Перенаправление неавторизованных запросов в представлениях на основе классов
-
class AccessMixin -
-
login_url -
Значение по умолчанию для
get_login_url(). По умолчанию равноNone, в этом случаеget_login_url()использует значение по умолчаниюsettings.LOGIN_URL.
-
permission_denied_message -
Значение по умолчанию для
get_permission_denied_message(). По умолчанию равно пустой строке.
-
redirect_field_name -
Значение по умолчанию для
get_redirect_field_name(). По умолчанию равно"next".
-
raise_exception -
Если этот атрибут установлен в
True, вместо перенаправления будет поднято исключениеPermissionDenied. По умолчанию равноFalse.
-
get_login_url() -
Возвращает URL, на который будут перенаправлены пользователи, не прошедшие проверку. Возвращает значение атрибута
login_url, если оно установлено, или значениеsettings.LOGIN_URLв противном случае.
-
get_permission_denied_message() -
Когда
raise_exceptionравноTrue, этот метод может использоваться для управления сообщением об ошибке, передаваемым обработчику ошибок для отображения пользователю. По умолчанию возвращает атрибутpermission_denied_message.
-
get_redirect_field_name() -
Возвращает имя параметра запроса, который будет содержать URL, на который необходимо перенаправить пользователя после успешного входа в систему. Если установить это значение в
None, параметр запроса не будет добавлен. По умолчанию возвращает атрибутredirect_field_name.
-
handle_no_permission() -
В зависимости от значения
raise_exception, метод либо вызывает исключениеPermissionDenied, либо перенаправляет пользователя наlogin_url, при этом необязательно включаетсяredirect_field_nameесли оно установлено.
-
Инвалидация сессии при изменении пароля
Если ваша модель пользователя AUTH_USER_MODEL унаследована от AbstractBaseUser или реализует свой метод get_session_auth_hash(), авторизованные сессии будут содержать хэш, возвращаемый этой функцией. В случае AbstractBaseUser это HMAC поля пароля. Django проверяет, что хэш в сессии для каждого запроса совпадает с хэшем, вычисленным во время запроса. Это позволяет пользователю выйти из всех своих сессий, изменив свой пароль.
Включаемые в Django представления по умолчанию для смены пароля, PasswordChangeView и представление user_change_password в админке django.contrib.auth, обновляют сессию с новым хэшем пароля, чтобы пользователь, меняющий свой собственный пароль, не выходил из системы. Если у вас есть пользовательское представление для изменения пароля и вы хотите получить аналогичное поведение, используйте функцию update_session_auth_hash().
-
update_session_auth_hash(request, user)[source] -
Данная функция принимает текущий запрос и обновлённый объект пользователя, от которого будет получен новый хэш сессии, и соответствующим образом обновляет хэш сессии. Она также вращает ключ сессии, чтобы украденный куки сессии стал недействительным.
Пример использования:
from django.contrib.auth import update_session_auth_hash def password_change(request): if request.method == 'POST': form = PasswordChangeForm(user=request.user, data=request.POST) if form.is_valid(): form.save() update_session_auth_hash(request, form.user) else: ...Изменено в Django 1.11:Добавлена ротация ключа сессии.
Примечание
Поскольку get_session_auth_hash() основано на SECRET_KEY, обновление вашего сайта с использованием нового секрета сделает все существующие сессии недействительными.
Предварительно настроенные представления авторизации
Django предоставляет несколько представлений, которые можно использовать для обработки входа в систему, выхода из системы и управления паролями. Они используют стандартные формы авторизации, но вы также можете передавать свои собственные формы.
Django не предоставляет по умолчанию шаблоны для представлений авторизации. Вы должны создать свои собственные шаблоны для используемых вами представлений. Контекст шаблона документирован в каждом представлении, см. Все представления авторизации.
Использование представлений
Существует несколько способов реализации этих представлений в вашем проекте. Самый простой способ — включить предоставленный URLconf в django.contrib.auth.urls в вашем собственном URLconf, например:
urlpatterns = [
path('accounts/', include('django.contrib.auth.urls')),
]
Это включит следующие URL-шаблоны:
accounts/login/ [name='login'] accounts/logout/ [name='logout'] accounts/password_change/ [name='password_change'] accounts/password_change/done/ [name='password_change_done'] accounts/password_reset/ [name='password_reset'] accounts/password_reset/done/ [name='password_reset_done'] accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm'] accounts/reset/done/ [name='password_reset_complete']
Представления предоставляют имя URL для более удобной ссылки. Подробности об использовании именованных URL-шаблонов см. в документации по URL.
Если вы хотите иметь больший контроль над своими URL, вы можете обратиться к конкретному представлению в вашем URLconf:
from django.contrib.auth import views as auth_views
urlpatterns = [
path('change-password/', auth_views.PasswordChangeView.as_view()),
]
Представления имеют необязательные аргументы, которые можно использовать для изменения поведения представления. Например, если вы хотите изменить имя шаблона, используемого представлением, вы можете указать аргумент template_name. Способ сделать это — предоставить ключевые аргументы в URLconf, которые будут переданы представлению. Например:
urlpatterns = [
path(
'change-password/',
auth_views.PasswordChangeView.as_view(template_name='change-password.html'),
),
]
Все представления основаны на классах, что позволяет легко их настраивать путём наследования.
Все представления авторизации
Это список всех представлений, которые предоставляет django.contrib.auth. Подробности реализации см. в разделе "Использование представлений".
-
login(request, template_name=`registration/login.html`, redirect_field_name='next', authentication_form=AuthenticationForm, extra_context=None, redirect_authenticated_user=False) -
Устарело начиная с версии 1.11: Функциональное представление
loginдолжно быть заменено на представление на основе классаLoginView.Необязательные аргументы этого представления аналогичны атрибутам представления на основе класса
LoginView.
-
class LoginView -
Добавлена в Django 1.11.
Имя URL:
loginПодробности об использовании именованных URL-шаблонов см. в документации по URL.
Атрибуты:
-
template_name: Имя шаблона для отображения представления, используемого для входа пользователя. По умолчаниюregistration/login.html. -
redirect_field_name: Имя поляGET, содержащего URL для перенаправления после входа. По умолчаниюnext. -
authentication_form: Вызываемый объект (обычно просто класс формы) для использования в процессе аутентификации. По умолчаниюAuthenticationForm. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым в шаблон. -
redirect_authenticated_user: Логическое значение, определяющее, перенаправлять ли аутентифицированных пользователей, обращающихся к странице входа, как будто они только что успешно вошли в систему. По умолчаниюFalse.Предупреждение
Если вы включите
redirect_authenticated_user, другие веб-сайты смогут определить, аутентифицированы ли посетители на вашем сайте, запросив URL перенаправления к файлам изображений на вашем сайте. Чтобы избежать утечки информации о «отпечатках социальных сетей», размещайте все изображения и favicon на отдельном домене.Включение
redirect_authenticated_userможет также привести к циклу перенаправления при использовании декоратораpermission_required(), если не используется параметрraise_exception. -
success_url_allowed_hosts:setхостов, помимоrequest.get_host(), которые безопасны для перенаправления после входа. По умолчанию пустойset.
Вот что делает
LoginView:- Если вызывается через
GET, отображается форма входа, отправляющая POST-запрос на тот же URL. Более подробно об этом чуть позже. - Если вызывается через
POSTс предоставленными пользователем учетными данными, он пытается войти в систему. Если вход успешен, представление перенаправляет на URL, указанный вnext. Еслиnextне указан, оно перенаправляет наsettings.LOGIN_REDIRECT_URL(по умолчанию/accounts/profile/). Если вход не удался, отображается форма входа.
Вы сами должны предоставить HTML для шаблона входа, который по умолчанию называется
registration/login.html. Этот шаблон получает четыре переменные контекста шаблона:-
form: ОбъектForm, представляющийAuthenticationForm. -
next: URL для перенаправления после успешного входа. Может содержать и строку запроса. -
site: ТекущийSiteв соответствии с настройкойSITE_ID. Если модуль сайтов не установлен, этот параметр будет установлен на экземплярRequestSite, который получает имя и домен сайта из текущегоHttpRequest. -
site_name: Псевдоним дляsite.name. Если модуль сайтов не установлен, этот параметр будет равен значениюrequest.META['SERVER_NAME']. Дополнительную информацию о модуле сайтов см. в разделе "Модуль сайтов".
Если вы предпочитаете не вызывать шаблон
registration/login.html, вы можете передать параметрtemplate_nameчерез дополнительные аргументы к методуas_viewв вашем URLconf. Например, эта строка URLconf будет использоватьmyapp/login.html:path('accounts/login/', auth_views.LoginView.as_view(template_name='myapp/login.html')),Вы также можете указать имя поля
GET, содержащего URL для перенаправления после входа, используяredirect_field_name. По умолчанию поле называетсяnext.Вот пример шаблона
registration/login.htmlдля начала. Предполагается, что у вас есть шаблонbase.html, который определяет блокcontent:{% extends "base.html" %} {% block content %} {% if form.errors %} <p>Your username and password didn't match. Please try again.</p> {% endif %} {% if next %} {% if user.is_authenticated %} <p>Your account doesn't have access to this page. To proceed, please login with an account that has access.</p> {% else %} <p>Please login to see this page.</p> {% endif %} {% endif %} <form method="post" action="{% url 'login' %}"> {% csrf_token %} <table> <tr> <td>{{ form.username.label_tag }}</td> <td>{{ form.username }}</td> </tr> <tr> <td>{{ form.password.label_tag }}</td> <td>{{ form.password }}</td> </tr> </table> <input type="submit" value="login" /> <input type="hidden" name="next" value="{{ next }}" /> </form> {# Assumes you setup the password_reset view in your URLconf #} <p><a href="{% url 'password_reset' %}">Lost password?</a></p> {% endblock %}Если у вас настроенная система аутентификации (см. Настройка системы аутентификации), вы можете использовать собственную форму аутентификации, задав атрибут
authentication_form. Эта форма должна принимать параметрrequestв своём методе__init__()и обеспечивать методget_user(), который возвращает объект аутентифицированного пользователя (этот метод вызывается только после успешной проверки формы). -
-
logout(request, next_page=None, template_name='registration/logged_out.html', redirect_field_name='next', extra_context=None) -
Устарело начиная с версии 1.11: Функциональное представление
logoutдолжно быть заменено на представление на основе классаLogoutView.Необязательные аргументы этого представления аналогичны атрибутам представления на основе класса
LogoutView.
-
class LogoutView -
Новое в Django 1.11.
Выход пользователя.
Имя URL:
logoutАтрибуты:
-
next_page: URL для перенаправления после выхода. По умолчаниюsettings.LOGOUT_REDIRECT_URL. -
template_name: Полное имя шаблона для отображения после выхода пользователя. По умолчаниюregistration/logged_out.html. -
redirect_field_name: Имя поляGETсодержащего URL для перенаправления после выхода. По умолчаниюnext. Переопределяет URLnext_pageесли задан параметрGET. -
extra_context: Словарь данных контекста, которые будут добавлены к стандартным данным контекста, передаваемым в шаблон. -
success_url_allowed_hosts:setхостов, помимоrequest.get_host(), которые безопасны для перенаправления после выхода. По умолчанию пустойset.
Контекст шаблона:
-
title: Строка “Выход”, локализованная. -
site: ТекущийSite, согласно настройкеSITE_ID. Если модуль сайтов не установлен, это будет экземплярRequestSite, который извлекает имя сайта и домен из текущегоHttpRequest. -
site_name: Псевдоним дляsite.name. Если модуль сайтов не установлен, это будет значениеrequest.META['SERVER_NAME']. Подробнее о сайтах см. Модуль «сайты».
-
-
logout_then_login(request, login_url=None, extra_context=None) -
Выход пользователя, затем перенаправление на страницу входа.
Имя URL: Не указан по умолчанию
Дополнительные аргументы:
-
login_url: URL страницы входа для перенаправления. По умолчаниюsettings.LOGIN_URL, если не указано. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым в шаблон.
Устарело начиная с версии 1.11: Неиспользуемый параметр
extra_contextустарел и будет удален в Django 2.1. -
-
password_change(request, template_name='registration/password_change_form.html', post_change_redirect=None, password_change_form=PasswordChangeForm, extra_context=None) -
Устарело начиная с версии 1.11: Функциональное представление
password_changeдолжно быть заменено на представление с классомPasswordChangeView.Дополнительные аргументы этого представления аналогичны атрибутам представления с классом
PasswordChangeView, за исключением аргументовpost_change_redirectиpassword_change_form, которые соответствуют атрибутамsuccess_urlиform_classпредставления с классом.
-
class PasswordChangeView -
Новое в Django 1.11.
Имя URL:
password_changeПозволяет пользователю изменить свой пароль.
Атрибуты:
-
template_name: Полное имя шаблона для отображения формы изменения пароля. По умолчаниюregistration/password_change_form.htmlесли не указано. -
success_url: URL для перенаправления после успешной смены пароля. -
form_class: Кастомная форма «смены пароля», которая должна приниматьuserаргумент. Форма отвечает за фактическое изменение пароля пользователя. По умолчаниюPasswordChangeForm. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым в шаблон.
Контекст шаблона:
-
form: Форма изменения пароля (см.form_classвыше).
-
-
password_change_done(request, template_name='registration/password_change_done.html', extra_context=None) -
Устарело начиная с версии 1.11: Функциональное представление
password_change_doneдолжно быть заменено на представление с классомPasswordChangeDoneView.Дополнительные аргументы этого представления аналогичны атрибутам представления с классом
PasswordChangeDoneView.
-
class PasswordChangeDoneView -
Новое в Django 1.11.
Имя URL:
password_change_doneСтраница, отображаемая после смены пользователем пароля.
Атрибуты:
-
template_name: Полное имя шаблона для использования. По умолчаниюregistration/password_change_done.htmlесли не указано. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым в шаблон.
-
-
password_reset(request, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', subject_template_name='registration/password_reset_subject.txt', password_reset_form=PasswordResetForm, token_generator=default_token_generator, post_reset_redirect=None, from_email=None, extra_context=None, html_email_template_name=None, extra_email_context=None) -
Устарело начиная с версии 1.11: Функциональное представление
password_resetдолжно быть заменено на представление с классомPasswordResetView.Дополнительные аргументы этого представления аналогичны атрибутам представления с классом
PasswordResetView, за исключением аргументовpost_reset_redirectиpassword_reset_form, которые соответствуют атрибутамsuccess_urlиform_classпредставления с классом.
-
class PasswordResetView -
Новое в Django 1.11.
Имя URL:
password_resetПозволяет пользователю сбросить пароль, сгенерировав одноразовую ссылку, которая может быть использована для сброса пароля, и отправив эту ссылку на зарегистрированный адрес электронной почты пользователя.
Если предоставленный адрес электронной почты не существует в системе, эта страница не отправит письмо, но пользователь также не получит сообщение об ошибке. Это предотвращает утечку информации потенциальным злоумышленникам. Если вы хотите вывести сообщение об ошибке в этом случае, вы можете унаследовать от
PasswordResetFormи использовать атрибутform_class.Пользователи с нерабочим паролем (см.
set_unusable_password()) не могут запросить сброс пароля для предотвращения злоупотребления при использовании внешнего источника аутентификации, такого как LDAP. Обратите внимание, что они не получат сообщение об ошибке, так как это бы показало существование их учетной записи, но письмо также не будет отправлено.Атрибуты:
-
template_name: Полное имя шаблона для отображения формы сброса пароля. По умолчаниюregistration/password_reset_form.htmlесли не указано. -
form_class: Форма, которая будет использоваться для получения адреса электронной почты пользователя, для которого необходимо сбросить пароль. По умолчаниюPasswordResetForm. -
email_template_name: Полное имя шаблона для создания письма со ссылкой на сброс пароля. По умолчаниюregistration/password_reset_email.htmlесли не указано. -
subject_template_name: Полное имя шаблона для темы письма со ссылкой на сброс пароля. По умолчаниюregistration/password_reset_subject.txtесли не указано. -
token_generator: Экземпляр класса для проверки одноразовой ссылки. По умолчаниюdefault_token_generator, это экземплярdjango.contrib.auth.tokens.PasswordResetTokenGenerator. -
success_url: URL для перенаправления после успешного запроса сброса пароля. -
from_email: Действительный адрес электронной почты. По умолчанию Django используетDEFAULT_FROM_EMAIL. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым шаблону. -
html_email_template_name: Полное имя шаблона для создания письма multipart с ссылкой на сброс пароля. По умолчанию HTML письмо не отправляется. -
extra_email_context: Словарь данных контекста, которые будут доступны в шаблоне письма.
Контекст шаблона:
-
form: Форма (см.form_classвыше) для сброса пароля пользователя.
Контекст шаблона письма:
-
email: Псевдоним дляuser.email -
user: ТекущийUser, в соответствии с полем формыemail. Только активные пользователи могут сбросить свои пароли (User.is_active is True). -
site_name: Псевдоним дляsite.name. Если у вас не установлен фреймворк сайта, это будет значениеrequest.META['SERVER_NAME']. Подробнее о сайтах см. Фреймворк “sites”. -
domain: Псевдоним дляsite.domain. Если у вас не установлен фреймворк сайта, это будет значениеrequest.get_host(). -
protocol: http или https -
uid: Первичный ключ пользователя, закодированный в base 64. -
token: Токен для проверки того, что ссылка на сброс пароля действительна.
Пример
registration/password_reset_email.html(шаблон тела письма):Someone asked for password reset for email {{ email }}. Follow the link below: {{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}Тот же контекст шаблона используется для шаблона темы. Тема должна быть строкой простого текста в одну строку.
-
-
password_reset_done(request, template_name='registration/password_reset_done.html', extra_context=None) -
Устарело начиная с версии 1.11: Функциональный вид
password_reset_doneдолжен быть заменен на вид с классамиPasswordResetDoneView.Необязательные аргументы этого вида аналогичны атрибутам вида с классами
PasswordResetDoneView.
-
class PasswordResetDoneView -
Новое в Django 1.11.
Имя URL:
password_reset_doneСтраница, отображаемая после того, как пользователю было отправлено письмо со ссылкой для сброса пароля. Этот вид используется по умолчанию, если у
PasswordResetViewнет явно заданного URLsuccess_url.Примечание
Если предоставленный адрес электронной почты не существует в системе, пользователь неактивен или имеет нерабочий пароль, пользователь всё равно будет перенаправлен на этот вид, но письмо не будет отправлено.
Атрибуты:
-
template_name: Полное имя шаблона для использования. По умолчаниюregistration/password_reset_done.htmlесли не указано. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым шаблону.
-
-
password_reset_confirm(request, uidb64=None, token=None, template_name='registration/password_reset_confirm.html', token_generator=default_token_generator, set_password_form=SetPasswordForm, post_reset_redirect=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональный вид
password_reset_confirmдолжен быть заменен на вид с классамиPasswordResetConfirmView.Необязательные аргументы этого вида аналогичны атрибутам вида с классами
PasswordResetConfirmViewза исключением аргументовpost_reset_redirectиset_password_form, которые сопоставляются с атрибутамиsuccess_urlиform_classвида с классами.
-
class PasswordResetConfirmView -
Новое в Django 1.11.
Имя URL:
password_reset_confirmОтображает форму для ввода нового пароля.
Ключевые аргументы из URL:
-
uidb64: Идентификатор пользователя, закодированный в base 64. -
token: Токен для проверки валидности пароля.
Атрибуты:
-
template_name: Полное имя шаблона для отображения подтверждения пароля. Значение по умолчаниюregistration/password_reset_confirm.html. -
token_generator: Экземпляр класса для проверки пароля. По умолчаниюdefault_token_generator, это экземплярdjango.contrib.auth.tokens.PasswordResetTokenGenerator. -
post_reset_login: Логическое значение, указывающее, должен ли пользователь быть автоматически аутентифицирован после успешного сброса пароля. По умолчаниюFalse. -
post_reset_login_backend: Путь к модулю аутентификации для использования при аутентификации пользователя, еслиpost_reset_loginравноTrue. Требуется только если у вас настроенно несколькоAUTHENTICATION_BACKENDS. По умолчаниюNone. -
form_class: Форма, которая будет использоваться для установки пароля. По умолчаниюSetPasswordForm. -
success_url: URL для перенаправления после сброса пароля. По умолчанию'password_reset_complete'. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым шаблону.
Контекст шаблона:
-
form: Форма (см.set_password_formвыше) для установки нового пароля пользователя. -
validlink: Булево значение, True, если ссылка (комбинацияuidb64иtoken) действительна или еще не использовалась.
-
-
password_reset_complete(request, template_name='registration/password_reset_complete.html', extra_context=None) -
Устарело начиная с версии 1.11: Функциональный вид
password_reset_completeдолжен быть заменен на вид с классамиPasswordResetCompleteView.Необязательные аргументы этого вида аналогичны атрибутам вида с классами
PasswordResetCompleteView.
-
class PasswordResetCompleteView -
Новое в Django 1.11.
Имя URL:
password_reset_completeОтображает вид, информирующий пользователя о том, что пароль успешно изменен.
Атрибуты:
-
template_name: Полное имя шаблона для отображения вида. По умолчаниюregistration/password_reset_complete.html. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым шаблону.
-
Вспомогательные функции
-
redirect_to_login(next, login_url=None, redirect_field_name='next') -
Перенаправляет на страницу входа, а затем обратно на другой URL после успешного входа.
Обязательные аргументы:
-
next: URL для перенаправления после успешного входа.
Необязательные аргументы:
-
login_url: URL страницы входа для перенаправления. По умолчаниюsettings.LOGIN_URLесли не указано. -
redirect_field_name: Имя поляGETсодержащего URL для перенаправления после выхода. Переопределяетnextесли передан данный параметрGET.
-
Встроенные формы
Если вы не хотите использовать встроенные представления, но хотите удобства, не прибегая к написанию форм для этой функциональности, система аутентификации предоставляет несколько встроенных форм, расположенных в django.contrib.auth.forms:
Примечание
Встроенные формы аутентификации делают определённые предположения о модели пользователя, с которой они работают. Если вы используете пользовательскую модель, может потребоваться определить собственные формы для системы аутентификации. Для получения дополнительной информации, обратитесь к документации о использовании встроенных форм аутентификации с пользовательскими моделями.
-
class AdminPasswordChangeForm -
Форма, используемая в интерфейсе администратора для изменения пароля пользователя.
Принимает
userв качестве первого позиционного аргумента.
-
class AuthenticationForm -
Форма для входа пользователя.
Принимает
requestв качестве первого позиционного аргумента, который хранится в экземпляре формы для использования подклассами.-
confirm_login_allowed(user) -
По умолчанию,
AuthenticationFormотклоняет пользователей, у которых флагis_activeустановлен в значениеFalse. Вы можете изменить это поведение с помощью пользовательской политики, определяющей, какие пользователи могут войти. Сделайте это с помощью пользовательской формы, которая наследуется отAuthenticationFormи переопределяет методconfirm_login_allowed(). Этот метод должен вызыватьValidationError, если данный пользователь не может войти.Например, чтобы разрешить вход всем пользователям независимо от статуса «активный»:
from django.contrib.auth.forms import AuthenticationForm class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm): def confirm_login_allowed(self, user): pass(В этом случае вам также нужно использовать механизм аутентификации, который позволяет неактивным пользователям войти, например,
AllowAllUsersModelBackend.)Или чтобы разрешить вход только некоторым активным пользователям:
class PickyAuthenticationForm(AuthenticationForm): def confirm_login_allowed(self, user): if not user.is_active: raise forms.ValidationError( _("This account is inactive."), code='inactive', ) if user.username.startswith('b'): raise forms.ValidationError( _("Sorry, accounts starting with 'b' aren't welcome here."), code='no_b_users', )
-
-
class PasswordChangeForm -
Форма, позволяющая пользователю изменить свой пароль.
-
class PasswordResetForm -
Форма для генерации и отправки по электронной почте одноразовой ссылки для сброса пароля пользователя.
-
send_mail(subject_template_name, email_template_name, context, from_email, to_email, html_email_template_name=None) -
Использует аргументы для отправки
EmailMultiAlternatives. Можно переопределить, чтобы настроить способ отправки письма пользователю.Параметры: - subject_template_name – шаблон для темы.
- email_template_name – шаблон для тела письма.
-
context – контекст, переданный в
subject_template,email_template, иhtml_email_template(если это неNone). - from_email – электронный адрес отправителя.
- to_email – электронный адрес запросителя.
-
html_email_template_name – шаблон для тела HTML; по умолчанию
None, в этом случае отправляется текстовое письмо.
По умолчанию,
save()заполняетcontextтеми же переменными, что иPasswordResetViewпередает в свой контекст электронной почты.
-
-
class SetPasswordForm -
Форма, которая позволяет пользователю изменить свой пароль, не вводя старый пароль.
-
class UserChangeForm -
Форма, используемая в интерфейсе администратора для изменения информации и разрешений пользователя.
-
class UserCreationForm -
A
ModelFormдля создания нового пользователя.Она имеет три поля:
username(из модели пользователя),password1, иpassword2. Она проверяет, чтоpassword1иpassword2совпадают, проверяет пароль с помощьюvalidate_password(), и устанавливает пароль пользователя с помощьюset_password().
Данные аутентификации в шаблонах
Текущий вошедший пользователь и его разрешения доступны в контексте шаблона, когда вы используете RequestContext.
Технические нюансы
Технически, эти переменные доступны только в контексте шаблона, если вы используете RequestContext и процессор контекста 'django.contrib.auth.context_processors.auth' включен. Он находится в файле настроек по умолчанию. Для более подробной информации, см. документацию RequestContext.
Пользователи
При рендеринге шаблона RequestContext, текущий вошедший пользователь, либо экземпляр User, либо экземпляр AnonymousUser, хранится в переменной шаблона {{ user }}:
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
Эта переменная контекста шаблона недоступна, если RequestContext не используется.
Разрешения
Разрешения текущего вошедшего пользователя хранятся в переменной шаблона {{ perms }}. Это экземпляр django.contrib.auth.context_processors.PermWrapper, который является шаблоно-совместимым прокси разрешений.
Вычисление одноуровневого поиска {{ perms }} как булевого значения является прокси для User.has_module_perms(). Например, чтобы проверить, имеет ли вошедший пользователь какие-либо разрешения в приложении foo:
{% if perms.foo %}
Вычисление двухступенчатого поиска как булевого значения является прокси для User.has_perm(). Например, чтобы проверить, имеет ли вошедший пользователь разрешение foo.can_vote:
{% if perms.foo.can_vote %}
Вот более полный пример проверки разрешений в шаблоне:
{% if perms.foo %}
<p>You have permission to do something in the foo app.</p>
{% if perms.foo.can_vote %}
<p>You can vote!</p>
{% endif %}
{% if perms.foo.can_drive %}
<p>You can drive!</p>
{% endif %}
{% else %}
<p>You don't have permission to do anything in the foo app.</p>
{% endif %}
Также можно искать разрешения с помощью {% if in %} операторов. Например:
{% if 'foo' in perms %}
{% if 'foo.can_vote' in perms %}
<p>In lookup works, too.</p>
{% endif %}
{% endif %}
Управление пользователями в административной панели
Когда у вас установлены как django.contrib.admin, так и django.contrib.auth, административная панель предоставляет удобный способ просмотра и управления пользователями, группами и разрешениями. Пользователи могут создаваться и удаляться как любые модели Django. Группы могут создаваться, а разрешения могут назначаться пользователям или группам. Также сохраняется и отображается журнал редактирования пользователем моделей внутри административной панели.
Создание пользователей
Вы должны увидеть ссылку «Пользователи» в разделе «Auth» на главной странице администратора. Страница администратора «Добавить пользователя» отличается от стандартных страниц администратора тем, что она требует выбора имени пользователя и пароля, прежде чем позволит редактировать остальные поля пользователя.
Также обратите внимание: если вы хотите, чтобы учётная запись пользователя могла создавать пользователей с помощью сайта Django admin, вам нужно предоставить им разрешение на добавление пользователей и изменение пользователей (т.е. разрешения «Добавить пользователя» и «Изменить пользователя»). Если учётная запись имеет разрешение на добавление пользователей, но не на изменение, эта учётная запись не сможет добавить пользователей. Почему? Потому что если у вас есть разрешение на добавление пользователей, у вас есть возможность создавать суперпользователей, которые, в свою очередь, могут изменять других пользователей. Таким образом, Django требует разрешения на добавление и изменение как дополнительную меру безопасности.
Обдумайте, как вы разрешаете пользователям управлять разрешениями. Если вы даёте не-суперпользователю возможность редактировать пользователей, это в конечном итоге равнозначно предоставлению ему статуса суперпользователя, поскольку он сможет повышать разрешения пользователей, включая себя!
Изменение паролей
Пароли пользователей не отображаются в административной панели (и не хранятся в базе данных), но отображаются подробности хранения паролей. Включается ссылка на форму изменения пароля, которая позволяет администраторам изменять пароли пользователей.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/topics/auth/default/