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

标签:Django,登录验证
0
投稿

猜你喜欢

  • 基于生活形态的用户分群研究

    2009-12-30 16:54:00
  • 微信小程序调用摄像头实现拍照功能

    2024-04-19 09:51:11
  • python实现二维数组的对角线遍历

    2023-05-15 06:08:01
  • MySQL Cluster集群的初级部署教程

    2024-01-22 01:50:16
  • 没有SQL Server数据库时如何打开.MDF文件

    2024-01-15 05:58:52
  • python中adb有什么功能

    2022-06-22 13:25:15
  • asp 横排显示数据

    2011-03-10 10:50:00
  • Python中实现ipaddress网络地址的处理

    2023-12-04 16:43:38
  • Python实现贪吃蛇小游戏(双人模式)

    2021-06-07 11:15:02
  • Python遍历文件夹和读写文件的实现代码

    2023-07-28 12:13:10
  • mssql查找备注(text,ntext)类型字段为空的方法

    2024-01-28 04:13:18
  • Python爬虫——爬取豆瓣电影Top250代码实例

    2022-01-31 02:47:22
  • python模块shutil函数应用示例详解教程

    2022-09-29 02:07:36
  • pydantic-resolve嵌套数据结构生成LoaderDepend管理contextvars

    2023-01-12 22:21:05
  • 教程:mysql申明变量以及赋值

    2009-10-26 10:31:00
  • SQL Server中使用sp_password重置SA密码实例

    2024-01-20 15:07:59
  • 如何合理使用数据库冗余字段的方法

    2024-01-18 16:52:00
  • Pycharm之如何安装cv2 [python3.6]

    2023-01-15 09:56:45
  • JavaScript+Node.js写一款markdown解析器

    2024-04-18 09:36:06
  • PHP获取当前相对于域名目录的方法

    2023-08-19 18:47:31
  • asp之家 网络编程 m.aspxhome.com