Пользователь 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
.