Django中怎样自定义认证后端,思路和方法是什么
Admin 2022-07-04 群英技术资讯 794 次浏览
很多朋友都对“Django中怎样自定义认证后端,思路和方法是什么”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧!那么,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' #返回自定义后端
通过上述测试,我们可以看到已经实现可自定义认证后端的应用。用户不仅可以使用用户名认证,还可以通过邮箱实现认证,从而在密码正确的情况下,可以使用两种方式实现用户的登录。实现自定义后端有很多的应用场景,比如你还可以换成手机号来进行用户认证等等。希望你们通过本节知识的学习会有所收获,下节继续!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章介绍了Python网络编程之HTTP客户端模块urllib与urllib3,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
最近在做基于python的数据分析工作,引用第三方数据分析库pandas,所以下面这篇文章主要给大家介绍了关于pandas应用实例之pivot函数的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
Python三位数逆序输出的方法及代码是什么,有不少朋友对此感兴趣,下面小编给大家整理和分享了相关知识和资料,易于大家学习和理解,有需要的朋友可以借鉴参考,下面我们一起来了解一下吧。
均匀性度量图像分割是图像像素分割的一种方法,当然还有其他很多的方法。本文将主要介绍下其原理和实现代码,感兴趣的小伙伴可以学习一下
内容介绍前言折线图绘制与显示绘制数学函数图像散点图绘制绘制柱状图绘制直方图饼图前言Matplotlib是Python中类似MATLAB的绘图工具,如果您熟悉MATLAB,那么可以很快的熟悉
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008