from django.contrib.auth.models import User
class EmailBackend(object):
def authenticate(self, request, **credentials):
#获取邮箱的认证信息即邮箱账号实例
email = credentials.get('email', credentials.get('username'))
try:
user = User.objects.get(email=email)
except Exception as error:
print(error)
else:
#检查用户密码
if user.check_password(credentials["password"]):
return user
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except Exception as e:
print(e)
return None
Django 模型类都有一个主键字段 (ID),它用来维护模型对象的唯一性。Django 提供了一个 pk 字段来代表主键 ID。
#自定义认证后端
AUTHENTICATION_BACKENDS=[
'django.contrib.auth.backends.ModelBackend',
'user.backends.EmailBackend',
]
这里需要大家注意一下:我们需要在 AUTHENTICATION_BACKENDS 变量中列出所有的认证后端,包含 Django 默认的以及自定义的,否则不能通过 username 和password 匹配的方式实现用户认证,比如上述代码中,我们自定义了一个通过邮箱和密码实现用户认证的后端,那么当我们在不使用用户名的情况下,还可以使用邮箱与正确的密码进行认证。
In [1]: from django.contrib.auth import authenticate In [2]: user=authenticate(username="bookstore",password="python_django") In [3]: user.backend Out[3]: 'django.contrib.auth.backends.ModelBackend' #返回Django默认后端 In [4]: user.backend Out[4]: 'django.contrib.auth.backends.ModelBackend' In [5]: user=authenticate(username="bookstore",password="python") In [6]: user is None Out[6]: True In [7]: user=authenticate(email="123@163.com",password="python_django") In [8]: user.bachend Out[8]: 'user.backends.EmailBackend' #返回自定义后端
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有