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 NoneDjango 模型类都有一个主键字段 (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' #返回自定义后端
本文链接:http://task.lmcjl.com/news/15968.html