Использование системы аутентификации 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 admin, вы также можете создавать пользователей интерактивно.
Создание суперпользователей
Создайте суперпользователей, используя команду createsuperuser:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
Вам будет предложено ввести пароль. После его ввода пользователь будет создан немедленно. Если вы опустите опции --username или --email, вам будет предложено ввести эти значения.
Изменение паролей
Django не хранит исходные (в виде открытого текста) пароли в модели пользователя, а только их хеши (см. документацию по управлению паролями для получения подробной информации). Поэтому не пытайтесь напрямую манипулировать атрибутом password пользователя. Именно поэтому при создании пользователя используется вспомогательная функция.
Для изменения пароля пользователя у вас есть несколько вариантов:
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 admin, вы также можете изменить пароли пользователей на страницах администрирования системы аутентификации.
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. Если вы не пишете собственную систему аутентификации, вам, вероятно, не нужно использовать его. Если вы хотите ограничить доступ для авторизованных пользователей, см. декораторlogin_required().
Разрешения и авторизация
Она используется сайтом 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.
Кэширование разрешений
Класс 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 использует сессии и middleware для подключения системы аутентификации к 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. ...Изменено в Django 1.10:В более старых версиях, когда вы вручную входите в систему пользователю, вы обязательно должны успешно аутентифицировать пользователя с помощью
authenticate()перед вызовомlogin(). Теперь вы можете установить бэкенд, используя новый аргументbackend.
Выбор бэкенда аутентификации
Когда пользователь входит в систему, идентификатор пользователя и бэкенд, используемый для аутентификации, сохраняются в сессии пользователя. Это позволяет одному и тому же бэкенду аутентификации извлекать данные пользователя в последующем запросе. Бэкенд аутентификации для сохранения в сессии выбирается следующим образом:
- Используйте значение необязательного аргумента
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 url(r'^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 Запрещено) вместо перенаправления на страницу входа.Если вы хотите использовать
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): ...
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, если оно установлено.
-
Отключение сессии при смене пароля
Проверка сессии включена и обязательна в Django 1.10 (отключить её невозможно) независимо от того, включено ли SessionAuthenticationMiddleware. В более старых версиях эта защита применяется только в том случае, если django.contrib.auth.middleware.SessionAuthenticationMiddleware включено в MIDDLEWARE.
Если ваш 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 = [
url('^', include('django.contrib.auth.urls')),
]
Это включит следующие шаблоны URL:
^login/$ [name='login']
^logout/$ [name='logout']
^password_change/$ [name='password_change']
^password_change/done/$ [name='password_change_done']
^password_reset/$ [name='password_reset']
^password_reset/done/$ [name='password_reset_done']
^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$ [name='password_reset_confirm']
^reset/done/$ [name='password_reset_complete']
Представления предоставляют имя URL для более удобной ссылки. См. документацию по URL для получения подробностей об использовании именованных шаблонов URL.
Если вы хотите больше контроля над вашими URL, вы можете обратиться к определённому представлению в вашем URLconf:
from django.contrib.auth import views as auth_views
urlpatterns = [
url('^change-password/$', auth_views.PasswordChangeView.as_view()),
]
Представления имеют необязательные аргументы, которые вы можете использовать для изменения поведения представления. Например, если вы хотите изменить имя шаблона, используемого представлением, вы можете передать аргумент template_name. Способ сделать это — передать именованные аргументы в URLconf, которые будут переданы представлению. Например:
urlpatterns = [
url(
'^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, current_app=None, extra_context=None, redirect_authenticated_user=False) -
Устарело начиная с версии 1.11: Функциональное представление
loginследует заменить на классовое представлениеLoginView.Необязательные аргументы этого представления аналогичны атрибутам классового представления
LoginView. Кроме того, у него есть:-
current_app: Подсказка, указывающая, в каком приложении находится текущее представление. См. стратегию разрешения именованных URL для получения дополнительной информации.
Устарело начиная с версии 1.9: Атрибут
current_appустарел и будет удалён в Django 2.0. Вызывающие стороны должны установитьrequest.current_appвместо него.Новое в Django 1.10:Параметр
redirect_authenticated_userбыл добавлен. -
-
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 на отдельном домене. -
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:url(r'^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', current_app=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональный вид
logoutдолжен быть заменен на представление с классомLogoutView.Необязательные аргументы этого представления похожи на атрибуты представления с классом
LogoutView. Кроме того, он имеет:-
current_app: Указание приложения, содержащего текущее представление. Подробнее см. в стратегии разрешения именованных URL.
Устарело начиная с версии 1.9: Атрибут
current_appустарел и будет удален в Django 2.0. Вызывающие стороны должны установитьrequest.current_appвместо него. -
-
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, current_app=None, extra_context=None) -
Выводит пользователя из системы, затем перенаправляет на страницу входа.
Имя URL: Нет по умолчанию
Дополнительные аргументы:
-
login_url: URL страницы входа для перенаправления. По умолчанию используетсяsettings.LOGIN_URL, если не указано. -
current_app: Подсказка, указывающая, в каком приложении находится текущий вид. Для получения дополнительной информации см. стратегию разрешения URL с именами пространств. -
extra_context: Словарь данных контекста, который будет добавлен к стандартным данным контекста, передаваемым шаблону.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Звонящие должны установитьrequest.current_appвместо него.Устарело начиная с версии 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, current_app=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональный вид
password_changeдолжен быть заменён на вид на основе классаPasswordChangeView.Дополнительные аргументы этого вида похожи на атрибуты вида на основе класса
PasswordChangeView, за исключением аргументовpost_change_redirectиpassword_change_form, которые соответствуют атрибутамsuccess_urlиform_classвида на основе класса. Кроме того, он имеет:-
current_app: Подсказка, указывающая, в каком приложении находится текущий вид. Для получения дополнительной информации см. стратегию разрешения URL с именами пространств.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Звонящие должны установитьrequest.current_appвместо него. -
-
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', current_app=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональный вид
password_change_doneдолжен быть заменён на вид на основе классаPasswordChangeDoneView.Дополнительные аргументы этого вида похожи на атрибуты вида на основе класса
PasswordChangeDoneView. Кроме того, он имеет:-
current_app: Подсказка, указывающая, в каком приложении находится текущий вид. Для получения дополнительной информации см. стратегию разрешения URL с именами пространств.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Звонящие должны установитьrequest.current_appвместо него. -
-
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, current_app=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вида на основе класса. Кроме того, он имеет:-
current_app: Подсказка, указывающая, в каком приложении находится текущий вид. Для получения дополнительной информации см. стратегию разрешения URL с именами пространств.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Звонящие должны установитьrequest.current_appвместо него. -
-
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: Полное имя шаблона, используемого для генерацииtext/htmlmultipart письма со ссылкой на сброс пароля. По умолчанию письмо 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']. Для получения более подробной информации о сайтах, см. Фреймворк «сайты». -
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', current_app=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональная страница
password_reset_doneдолжна быть заменена на страницуPasswordResetDoneViewна основе класса.Необязательные аргументы этой страницы похожи на атрибуты страницы на основе класса
PasswordResetDoneView. Кроме того, она имеет:-
current_app: Подсказка, указывающая, какой приложение содержит текущую страницу. Для получения дополнительной информации см. стратегию разрешения URL с именованными пространствами имен.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Обработчики должны установитьrequest.current_appвместо этого. -
-
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, current_app=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональная страница
password_reset_confirmдолжна быть заменена на страницуPasswordResetConfirmViewна основе класса.Необязательные аргументы этой страницы похожи на атрибуты страницы на основе класса
PasswordResetConfirmView, за исключением аргументовpost_reset_redirectиset_password_form, которые сопоставлены с атрибутамиsuccess_urlиform_classстраницы на основе класса. Кроме того, она имеет:-
current_app: Подсказка, указывающая, какой приложение содержит текущую страницу. Для получения дополнительной информации см. стратегию разрешения URL с именованными пространствами имен.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Обработчики должны установитьrequest.current_appвместо этого. -
-
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', current_app=None, extra_context=None) -
Устарело начиная с версии 1.11: Функциональное представление
password_reset_completeдолжно быть заменено на представление на основе классаPasswordResetCompleteView.Необязательные аргументы этого представления аналогичны атрибутам представления на основе класса
PasswordResetCompleteView. Кроме того, оно имеет:-
current_app: Подсказка, указывающая, в каком приложении содержится текущее представление. Дополнительную информацию см. в стратегии разрешения именованных URL-адресов.
Устарело начиная с версии 1.9: Параметр
current_appустарел и будет удален в Django 2.0. Звонящие должны установитьrequest.current_appвместо этого. -
-
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 -
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. Этот пример отобразит True если вошедший в систему пользователь имел какие-либо разрешения в приложении foo:
{{ perms.foo }}
Поиск атрибутов по двум уровням — это прокси для User.has_perm. В этом примере будет отображаться True, если у вошедшего пользователя есть разрешение foo.can_vote:
{{ perms.foo.can_vote }}
Таким образом, вы можете проверять разрешения в шаблонах {% if %}:
{% 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, необходимо предоставить им разрешение на добавление пользователей и изменение пользователей (т. е. разрешения «Добавить пользователя» и «Изменить пользователя»). Если учетная запись имеет разрешение на добавление пользователей, но не на изменение, эта учетная запись не сможет добавлять пользователей. Почему? Потому что если у вас есть разрешение на добавление пользователей, вы можете создать суперпользователей, которые, в свою очередь, могут изменять других пользователей. Поэтому Django требует разрешения на добавление и изменение как мера безопасности.
Внимательно продумайте, как вы позволяете пользователям управлять разрешениями. Если вы предоставляете не суперпользователю возможность редактировать пользователей, это в конечном итоге равносильно предоставлению им статуса суперпользователя, потому что они смогут повышать права пользователей, включая себя!
Изменение паролей
Пароли пользователей не отображаются в админ-панели (также не хранятся в базе данных), но отображаются подробности хранения паролей. В этой информации содержится ссылка на форму смены пароля, которая позволяет администраторам изменять пароли пользователей.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.11/topics/auth/default/