Django auth 应用默认支持用户名(username)进行登录。但是在实践中,网站可能还需要邮箱、手机号、身份证号等进行登录,这就需要我们自己写一个认证后台,用于验证用户输入的用户信息是否正确,从而对拥有正确凭据的用户进行登录认证。

Django 验证用户合法性的方式

Django 对用户登录的验证工作均在一个被称作认证后台(Authentication Backend)的类中进行。这个类是一个普通的 Python 类,它有一个 authenticate 方法,接收登录用户提供的凭据(如用户名或者邮箱以及密码)作为参数,并根据这些凭据判断用户是否合法(即是否是已注册用户,密码是否正确等)。下面是 Django 内置的认证后台的部分源代码,从代码中可以清晰地看到其工作方式:

django.contrib.auth.backends

class ModelBackend(object):
"""
Authenticates against settings.AUTH_USER_MODEL.
""" def authenticate(self, request, username=None, password=None, **kwargs):
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
user = UserModel._default_manager.get_by_natural_key(username)
except UserModel.DoesNotExist:
# Run the default password hasher once to reduce the timing
# difference between an existing and a non-existing user (#20760).
UserModel().set_password(password)
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user

这段代码根据用户传入的 username 和 password,验证该 username 对应的用户是否存在以及密码是否正确,是则返回该 user 对象。

可以定义多个认证后台,Django 内部会逐一调用这些后台的 authenticate 方法来验证用户提供登录凭据的合法性,一旦通过某个后台的验证,表明用户提供的凭据合法,从而允许登录该用户。

Email Backend

在本示例项目中,用户注册时需要填写邮箱。因为 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 和密码,检查该 emai 对应的用户是否存在,如果存在则检查密码是否正确,如果密码也没有问题,则返回该 user 对象。

配置 Backend

接下来就要告诉 Django,需要使用哪些 Backends 对用户的凭据信息进行验证,这需要在 settings.py 中设置:

settings.py

AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'users.backends.EmailBackend',
)

第一个 Backend 是 Django 内置的 Backend,当用户提供的是用户名和正确的密码时该 Backend 会通过验证;第二个 Backend 是刚刚自定义的 Backend,当用户提供的是 Email 和正确的密码时该 Backend 会通过验证。

测试

在登录界面输入注册时的邮箱和正确的密码,可以发现也可以登录成功了,说明我们自定义的 Backend 是有效的。大功告成!

django用户认证系统——自定义认证后台8的更多相关文章

  1. Django认证系统auth认证

    使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...

  2. django中怎么使用自定义管理后台xadmin

    django中怎么使用自定义管理后台xadmin 2018年05月19日 15:48:08 LH_python 阅读数:1001   首先创建基本的django项目,配置好基本的model ,url, ...

  3. Django用户登陆以及跳转后台管理页面3

    Django用户登陆以及跳转后台管理页面1http://www.cnblogs.com/ujq3/p/7891774.html Django用户登陆以及跳转后台管理页面2http://www.cnbl ...

  4. Django用户登陆以及跳转后台管理页面2

    请先写好以下,再来替换文件 Django用户登陆以及跳转后台管理页面1http://www.cnblogs.com/ujq3/p/7891774.html from django.shortcuts ...

  5. django(权限、认证)系统——自定义UserProfile储存User额外信息

    上篇文章我们引出了Django内置的权限控制系统,讲了安装,和最核心和基本的User模型的API和其Manager的API. 接下来我们继续深入下去,使用User对象做一些事情,首先当然就是创建一个U ...

  6. Django(62)自定义认证类

    前言 如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的 源码分析 源码的入口在APIView.py文件下的di ...

  7. DRF认证、自定义认证和权限、自定义权限

    源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...

  8. django用户投票系统详解

    投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...

  9. Django用户登陆以及跳转后台管理页面1

    """S14Djngo URL Configuration The `urlpatterns` list routes URLs to views. For more i ...

随机推荐

  1. URL重写:RewriteCond指令与RewriteRule 指令格式

    Rewirte基本的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正則表達式规范.平时帮助我们实现拟静态,拟文件夹,域名跳转,防止盗链等.本文将针对mod_rewrite和URL匹配的技术 ...

  2. zabbix_get :command not found 解决办法

    zabbix_get 找不到命令是因为没有安装上zabbix_get ,解决办法: 1.yum list all |grep zabbix 返回一个列表,表中出现 zabbix-get.x86_84 ...

  3. 学习-短信的上行(MO)和下行(MT)详解

    基础知识: SP服务提供商: 通常是指在移动网内运营增值业务的社会合作单位, 它们建立与移动网络建立相连的服务平台, 为手机用户提供一系列信息服务, 如:娱乐.游戏.短信.彩信.WAP.彩铃.铃声下载 ...

  4. Linux修改时间的方法

    http://www.blogjava.net/itvincent/archive/2007/08/03/134242.html修改linux的时间可以使用date指令 在命令行输入: date 显示 ...

  5. unity3d世界坐标系和本地坐标系

    transform.Translate(Vector3.forware);//向着自己坐标前方 transform.Translate(Vector3.forware,Space.World);//向 ...

  6. JS正则表达式(转载)

    在JavaScript中,RegExp对象表示正则表达式,用来对字符串进行匹配. 一.两种定义方法: 1.直接量法: /pattern/attribute 2.对象法: new RegExp(patt ...

  7. [k8s]组件日志级别说明

    kubectl 执行命令时候 --v 调试, 也可以用作其他组件的 --v配置 参考: https://kubernetes.io/docs/user-guide/kubectl-cheatsheet ...

  8. 从0到1,Java Web网站架构搭建的技术演进

    俗话说得好,冰冻三尺非一日之寒,滴水穿石非一日之功,罗马也不是一天就建成的,对于开发人员来说,一个好的架构并不是一蹴而就的. 初始搭建 最开始,就是各种框架一搭,然后扔到 Tomcat 容器中跑,这时 ...

  9. java之Thread Dump分析

    什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机 ...

  10. Jquery学习笔记(1)--JQuery原理,与JS对象互换,核心函数

    js对象转jQuery对象,$('num'), jQuery对象转js对象,$('num')[0],或$('num').get(0). 1.点击换行,each(),html(),attr(),每个h1 ...