因为 Django auth 应用内置只支持用户名和密码的认证方式,所以
目前用户是无法使用 Email 进行登录的。
为了实现邮箱登录,我们需要编写一个认证后台。
这个后台的作用便是验证用户提供的凭据(这里是邮箱以及密码)是合法的。
完全仿照内置的 ModelBackend 代码即可。
首先在 users 应用下新建一个 backends.py 文件,然后写入如下代码:
users/backends.py
from .models import User
class EmailBackend(object):
def authenticate(self, request, **credentials):
# 要注意登录表单中用户输入的用户名或者邮箱的 field 名均为 username
email = credentials.get('email', credentials.get('username'))
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
pass
else:
if user.check_password(credentials["password"]):
return user
def get_user(self, user_id):
"""
该方法是必须的
"""
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
逻辑非常简单,就是根据用户提供的 Email 和密码,检查该 email
对应的用户是否存在,如果存在则检查密码是否正确,如果密码也没有
问题,则返回该 user 对象。
配置 Backend
接下来就要告诉 Django,需要使用哪些 Backends 对用户的凭据信息进行验证,这需要在 settings.py 中设置:
settings.pyAUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'users.backends.EmailBackend',
)
第一个 Backend 是 Django 内置的 Backend,当用户提供的是用
户名和正确的密码时该 Backend 会通过验证;第二个 Backend 是
刚刚自定义的 Backend,当用户提供的是 Email 和正确的密码时该
Backend 会通过验证。