0
我为学校创建了一个django项目,并且有三种主要类型的用户 - 家长,教师和学生。对于家长和老师,我希望他们使用电子邮件登录(他们目前正在使用电子邮件登录系统)。允许电子邮件和用户名在django项目中登录
但是,对于学生,我希望他们使用传统的用户名方式(因为年幼的孩子没有电子邮件)登录。这是可能在Django中做的还是只有一个用户认证模型允许?
我为学校创建了一个django项目,并且有三种主要类型的用户 - 家长,教师和学生。对于家长和老师,我希望他们使用电子邮件登录(他们目前正在使用电子邮件登录系统)。允许电子邮件和用户名在django项目中登录
但是,对于学生,我希望他们使用传统的用户名方式(因为年幼的孩子没有电子邮件)登录。这是可能在Django中做的还是只有一个用户认证模型允许?
您可以创建单独的AuthenticationEmailBackend
仅用于通过电子邮件记录并将其添加到设置中的AUTHENTICATION_BACKENDS
。通过这种方式,如果之前的AUTHENTICATION_BACKENDS
认证失败,则使用不同的AUTHENTICATION_BACKENDS
作为替代方案。
应用程序/ 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
列表中的用户可以通过用户名或邮箱登录。
相关:https://stackoverflow.com/questions/37332190/django-login-with-email#37332393除了你必须检查电子邮件和用户名。如果返回两个用户,我建议您验证两者并发出错误(想象用户将电子邮件**作为**用户名) –
谢谢。因此,字段可以接受用户名和电子邮件。所以家长/老师会使用电子邮件,孩子们使用他们的用户名? –