Таким образом, вы должны создать пользовательский бэкэнд аутентификации.Пользователь до аутентификации является анонимным, поэтому мы не можем сказать, является ли он администратором или нет.Я думаю, что вы можете сделать это, чтобы аутентифицировать пользователей, используя либо имя пользователя, либо электронную почту, если они являются администратором, аутентифицируют их независимо от того, что они использовали (имя пользователя или адрес электронной почты), но обычные пользователи должны использовать электронную почту, если это не так, вернуть None.
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.core.validators import validate_email
from django.contrib.auth.hashers import check_password
class MyAuthenticationBackend(ModelBackend):
"""
Authenticate All users if Email is used but just the admin if username is used
"""
def authenticate(self, request, username=None, password=None):
try:
validate_email(username)
valid_email = True
kwargs = {'email': username}
except:
valid_email = False
kwargs = {'username': username}
try:
user = get_user_model().objects.get(**kwargs)
except get_user_model().DoesNotExist:
print("User model does not exist!")
return None
if valid_email and user.check_password(password):
print("Email used. Authenticate all users")
return user
elif not valid_email and user.check_password(password) and user.is_admin:
print("Username used. Authenticate admin users")
return user
else:
print("something else return None")
return None
def get_user(self, user_id):
try:
return get_user_model().objects.get(pk=user_id)
except get_user_model().DoesNotExist:
return None
и в settings.py
файле
AUTHENTICATION_BACKENDS = [
'app.admin.MyAuthenticationBackend',
]
Поля, которые вы используете для аутентификации, должны иметь уникальное значение True, а пробел и ноль должны быть False.
email = models.EmailField(
null=True,
blank=True,
verbose_name='email address',
max_length=255,
unique=True,
)
username = models.CharField(
null=True,
blank=True,
verbose_name=_('User id'),
max_length=128,
unique=True,
)