Пользователь Django is_authenticated vs. is_active
Прочитав документацию, я все еще не до конца понимаю разницу между этими двумя методами User: is_authenticated и is_active.
Оба возвращают булево значение. В то время как is_authenticated доступен только для чтения (и вы получите ошибку, если попытаетесь установить его), is_active может быть изменен, и, например, вы можете установить его в False вместо удаления аккаунта.
Выполнение этих команд приведет к деактивации пользователя:
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(pk=10) # get an arbitrary user
>>> u.is_active
True
>>> u.is_active = False # change the value
>>> u.save() # save to make effective
>>> u.is_authenticated
True
Теперь этот пользователь все еще аутентифицирован, но больше не может войти в систему.
В представлении входа в систему используется authenticate(). Что на самом деле происходит, что вход для деактивированного пользователя не удается?
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password1']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
Для проверки учетных данных используется authenticate(), который возвращает объект User в случае успеха или None в противном случае. Я предполагаю, что он возвращает None в случае, если предоставленные учетные данные верны, но is_active - False.
Кроме того, блок Jinja {% if user.is_authenticated %} оценивается как false, если is_active является False, что сбивает с толку, когда я думаю, что user.is_authenticated является True и доступен только для чтения.
выглядит очень похоже на представление входа в систему - за исключением сохранения формы. На мой взгляд, использование authenticate() выглядит идентично случаю входа в систему. Что я упускаю?
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
user = authenticate(request, username=username, password=password)
login(request, user)
TLDR: Пересказ вопросов:
- что происходит с проверкой
authenticate()в представлении входа для деактивированного пользователя и почему{% user.is_authenticated %}ложно? - какова разница для
authenticate()между представлениями входа и регистрации? - эквивалентно ли
is_authenticatedсказать, что пользователь существует?
is_active - это атрибут учетных записей пользователей, который можно включать и выключать. Вы можете сделать это в интерфейсе администратора или программно. Вход в систему разрешен только активным пользователям. Т.е. вы можете использовать флаг is_active, чтобы запретить пользователю входить в систему без необходимости менять пароль, удалять аккаунт или делать что-то еще более радикальное.
is_authenticated - это атрибут конкретного используемого пользовательского класса. Если у вас есть реальные объекты User, их атрибут is_authenticated всегда true; это статически установленный атрибут класса User.
Атрибут is_authenticated актуален только для пользовательских объектов по запросам:
def view(request):
if request.user.is_authenticated:
...
Если бы пользователь запроса был не аутентифицирован, request.user был бы не объектом User, а объектом AnonymousUser, атрибутом is_authenticated которого всегда является False. Идея здесь в том, что request.user всегда существует, независимо от того, аутентифицирован пользователь в данный момент или нет. Это означает, что вам не нужно писать код типа if request.user is not None and request.user..... Вы всегда можете ожидать существования объекта user, и вы можете различать аутентифицированных и неаутентифицированных (анонимных) пользователей с помощью атрибута is_authenticated.