Django通过自定义认证后端实现多种登录方式验证
作者:newname 发布时间:2022-09-21 20:15:40
前言
我们见到几乎所有的 Web 网站或者手机 App 也好,它们的最终目的都是要留住用户,提升自己网站的用户注册量,所以说用户的概念也必须深入到每一个程序开发者的心中。而权限呢?它限制了用户可以拥有哪些功能,比如说某项只有付费会员才可以观看的教程,这就用到了用户的权限设置,可以一言一概之,用户的实现业务系统中的数据隔离,而权限则限定了用户可以使用的哪些功能。
那么,Django 提供的用户认证系统如何在项目中进行应用呢?在本节我们将给大家介绍如何使用用户认证系统,实现我们业务场景中常见的多种登录方式验证。这里就用到了自定义认证后端。
实现自定义认证后端
在《Django Auth应用实现用户身份认证》中,我们讲到用户的认证需要通过 authenticate 方法实现,而该方法就是使用 Django 默认认证后端 ModeBackend 进行用户验证的,但这种验证只是简单地比对数据库中存储的用户名和密码是否匹配一致,这样就会导致在很多情况下不能满足实际的业务的需求。这个时候我们就可以自定义一个认证后端,来实现某些需求。
1) 实现认证后端思路分析
那么如何实现自定义认证后端呢?如果你没有思路,不妨先分析一下 Django 默认的认证后端是如何实现的,从源码中你也许会找到一些启发。
首先如何想要实现用户的认证必须先要获得用户对象,然后调用 authenticate 方法实现认证,所以可想而认证后端是实现了 get_user 和 authenticate 这两个方法的 Python 类。其中 authenticate 将用户身份凭据作为关键字参数,下面我就实现一个简单的认证后端。
2) 实现认证后端的过程
在 user 应用下新建 backends.py 文件,将其作为单独模块出来,定义如下代码:
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。
我们在 authenticate 方法中,首先判断在用户名与密码不为空的情况下,尝试根据 username 获取 User 对象,然后再去比较 password 是否等同于 python_django,若相同则通过验证,所以这个密码可以实现任意用户的验证。最后如果要让自定义认证后端成功认证,还需要在配置文件 settings 中进行如下配置:
#自定义认证后端
AUTHENTICATION_BACKENDS=[
'django.contrib.auth.backends.ModelBackend',
'user.backends.EmailBackend',
]
这里需要大家注意一下:我们需要在 AUTHENTICATION_BACKENDS 变量中列出所有的认证后端,包含 Django 默认的以及自定义的,否则不能通过 username 和password 匹配的方式实现用户认证,比如上述代码中,我们自定义了一个通过邮箱和密码实现用户认证的后端,那么当我们在不使用用户名的情况下,还可以使用邮箱与正确的密码进行认证。
3) 验证认证后端是否生效
打开 Django Shell 环境 进行测试,如下所示
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://c.biancheng.net/view/8045.html
猜你喜欢
- 通常说到外键,只会提到“外键的目的是确定资料的参考完整性(referential integrity)。”,但是外键具体包含哪些动作和含义呢
- 目录Python1 Python垃圾回收机制是什么2 元组和列表的区别3 元组可以作为字典的key?4 进程 线程 协程4.1 进程4.2
- 今天偶然看到“一个有将近两年的div + CSS 开发经验和历史,曾经是Web标准绝对拥趸的同志”在自己的blog上发表放弃div+css的
- python共现矩阵实现最近在学习python词库的可视化,其中有一个依据共现矩阵制作的可视化,感觉十分炫酷,便以此复刻。项目背景本人利用爬
- 现在介绍加速网页图形显示速度的六种方法,为你解决这个难题。其最基本的宗旨就是,让你用买鱼的价钱,品尝到熊掌的美味和营养。 1.首先要确定图像
- 目录安装基本操作打开图像转换格式展示图片剪裁合并缩略图旋转滤镜二次创作画线文字总结文 | 豆豆来源:Python 技术「ID: python
- 简单的仿图片验证码,适合新手简单的仿图片验证码演示,很容易被破解,实用性不大,但拿出来给新手学习一下还是不错的:JScript.Asp代码示
- 本文实例讲述了Python3实现将文件归档到zip文件及从zip文件中读取数据的方法。分享给大家供大家参考。具体实现方法如下:'
- ff默认不让改 statusopera9 测试通过ie6 测试通过这东西是给统计部门用的,分析用户习惯以改良网站布局
- function chinese2unicode(Str) &nbs
- 1、TCP连接的建立方法客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较。步骤TCP客户端TCP服务器
- 双屏不是什么新鲜事,不过相信国内前端工程师还是用单屏的多,前端开发需要同时开启的屏幕太多了…你有没有迷失windows任务栏下n个窗口和AL
- 本文实例讲述了Python中super关键字用法。分享给大家供大家参考。具体分析如下:在Python类的方法(method)中,要调用父类的
- 学习前言上一篇讲了如何构建回归算法,这一次将怎么进行简单分类。Keras中分类的重要函数1、np_utils.to_categoricaln
- 制作NBA数据爬虫捋顺思路我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相
- 系列一:图片格式介绍Gif格式特点透明性Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha 透明)
- Python input()函数Python input()函数教程在 Python 中,input() 函数用于获取用于的输入,并给出提示
- 在php中实现验证码还是很方便的,关键点在于掌握php gd库与session的用法。纵观网上php 生成验证码的例子,无不是php gd库
- 概述从今天开始, 小白我将带领大家一起来补充一下 数据库的知识.数据控制语言数据控制语言 (Data Control Language) 是
- 如下所示:import tensorflow as tfsess = tf.Session(config=tf.ConfigProto(lo