我正在为一所学校创建一个 django 项目,主要有三种用户 - 家长、老师和学生。对于家长和老师,我希望他们使用电子邮件登录(他们目前使用旧系统的电子邮件登录)。
但是,对于学生,我希望他们使用传统的用户名方法登录(因为年幼的 child 没有电子邮件)。这可能在 Django 中执行还是只允许一种用户身份验证模型?
请您参考如下方法:
您可以创建单独的 AuthenticationEmailBackend 仅用于通过电子邮件登录并将其添加到设置中的 AUTHENTICATION_BACKENDS。通过这种方式,如果先前的 AUTHENTICATION_BACKENDS 身份验证失败,则使用不同的 AUTHENTICATION_BACKENDS 作为替代方案。
app/auth.py
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
class AuthenticationEmailBackend(object):
def authenticate(self, username=None, password=None, **kwargs):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if getattr(user, 'is_active', False) and user.check_password(password):
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
settings.py
AUTHENTICATION_BACKENDS = (
"django.contrib.auth.backends.ModelBackend",
...
"app.auth.AuthenticationEmailBackend",
)
如果您在列表中保留默认的 django.contrib.auth.backends.ModelBackend,用户可以通过用户名或电子邮件登录。
