Python如何实现后端自定义认证并实现多条件登陆

1.须知

JWT扩展的登录视图,在收到用户名与密码时,也是调用Django的认证系统Auth模型中提供的**authenticate()**来检查用户名与密码是否正确。

我们可以通过修改Django认证系统的认证后端(主要是authenticate方法)来支持登录账号既可以是用户名也可以是手机号。

`authenticate(self, request, username=None, password=None, **kwargs)`方法的参数说明:

  • - request 本次认证的请求对象
  • - username 本次认证提供的用户账号
  • - password 本次认证提供的密码

我们想要让用户既可以以用户名登录,也可以以手机号登录,那么对于authenticate方法而言,username参数即表示用户名或者手机号。

重写authenticate方法的思路:

1. 根据username参数查找用户User对象,username参数可能是用户名,也可能是手机号
2. 若查找到User对象,调用User对象的check_password方法检查密码是否正确

2. 添加自定义认证函数,在users/utils.py中编写:

"""实现多条件登录"""
from django.contrib.auth.backends import ModelBackend
from .models import User
from django.db.models import Q

def get_user_by_account(account):
  """通过账号信息获取用户"""
  try:
    user = User.objects.get(Q(username=account) | Q(mobile=account) )
  except User.DoesNotExist:
    user = None
  return user

class UsernameMobileAuthBackend(ModelBackend):
  def authenticate(self, request, username=None, password=None, **kwargs):
    # 获取用户
    user = get_user_by_account(username)

    # 验证密码和是否允许登录
    if user is not None and user.check_password(password) and self.user_can_authenticate(user):
      return user

3.在配置文件settings/dev.py中告知Django使用我们自定义的认证后端

AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]

在配置文件中进行设置,就是将自定义认证函数的地址告知django认证系统

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python使用LDAP做用户认证的方法

    LDAP(Light Directory Access Portocol)是轻量目录访问协议,基于X.500标准,支持TCP/IP. LDAP目录以树状的层次结构来存储数据.每个目录记录都有标识名(Distinguished Name,简称DN),用来读取单个记录, 一般是这样的: cn=username,ou=people,dc=test,dc=com 几个关键字的含义如下: base dn:LDAP目录树的最顶部,也就是树的根,是上面的dc=test,dc=com部分,一般使用公司的域名,也

  • python pycurl验证basic和digest认证的方法

    简介 pycurl类似于Python的urllib,但是pycurl是对libcurl的封装,速度更快. 本文使用的是pycurl 7.43.0.1版本. Apache下配置Basic认证 生成basic密码文件 htpasswd -bc passwd.basic test 123456 开启mod_auth_basic LoadModule auth_basic_module modules/mod_auth_basic.so 配置到具体目录 <Directory "D:/test/ba

  • Python使用htpasswd实现基本认证授权的例子

    前面我讲解了如何将树莓派(Raspberry Pi)打造成无线路由,感觉每次通过命令ssh管理显麻烦,于是自己动手编写Web界面,主要是使用Python编写的CGI程序,这里用到了mini_httpd这款轻量的Web服务器,本来想装nginx的,但是想想还是精简一些吧,毕竟资源有限,况且Web管理界面仅我一个人访问. CGI应用跑起来了,但问题来了,如何实现普通路由的那种打开页面就弹出输入用户名密码的对话框? 这里主要用到HTTP协议的一个知识,那就是HTTP基本认证. 服务器端通过发送类似下面

  • python实现身份证实名认证的方法实例

    前言 本文主要给大家介绍了关于python实现身份证实名认证的方法,文中通过示例代码介绍的非常详细,下面话不多说了,来一起看看详细的介绍吧 方法如下 一.首先我们选用了阿里云的身份证实名认证接口: https://market.aliyun.com/products/57000002/cmapi022049.html?spm=5176.2020520132.101.2.3fe77218O6ZDdd#sku=yuncode1604900000 二.编译并运行源代码 import requests

  • python2.7+selenium2实现淘宝滑块自动认证功能

    本文为大家分享了python2.7+selenium2实现淘宝滑块自动认证的具体代码,供大家参考,具体内容如下 1.编译环境 操作系统:win7:语言:python2.7+selenium2:ide:pycharm:浏览器:IE10,chrome 2.1意外开始 今天登录淘宝时候发现吧密码搞忘了,选择找回密码时淘宝居然加了滑块认证. 恰巧自己也在学习selenium,就想试一试能不能实现自动拖动滑块. 2.2 度娘查找 由于自己没多少思路,第一选择就是问度娘,终于找到一篇文章,该文章使用C#实现

  • python连接mongodb密码认证实例

    如下所示: from pymongo import MongoClient #建立和数据库系统的连接,指定host及port参数 client = MongoClient('localhost', 27017) #连接mydb数据库,账号密码认证 db = client.mydb db.authenticate("account", "password") #连接表 collection = db.myset #查看全部表名称 db.collection_names

  • 将Python的Django框架与认证系统整合的方法

    将Django与其他现有认证系统的用户名和密码或者认证方法进行整合是可以办到的. 例如,你所在的公司也许已经安装了LDAP,并且为每一个员工都存储了相应的用户名和密码. 如果用户在LDAP和基于Django的应用上拥有独立的账号,那么这时无论对于网络管理员还是用户自己来说,都是一件很令人头痛的事儿. 为了解决这样的问题,Django认证系统能让您以插件方式与其他认证资源进行交互. 您可以覆盖Diango默认的基于数据库的模式,您还可以使用默认的系统与其他系统进行交互. 指定认证后台 在后台,Dj

  • 微信小程序python用户认证的实现

    这里用到django-rest-framework-jwt这个库   https://github.com/GetBlimp/django-rest-framework-jwt 按流程图来 先通过wx.login()获取code,再通过我们后台配置的接口获取openid和session_key // 登录 wx.login({ success: res => { console.log(res) // 发送 res.code 到后台换取 openId, sessionKey, unionId w

  • Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)

    我们可以利用urllib来抓取远程的数据进行保存哦,以下是python3 抓取网页资源的多种方法,有需要的可以参考借鉴. 1.最简单 import urllib.request response = urllib.request.urlopen('http://python.org/') html = response.read() 2.使用 Request import urllib.request req = urllib.request.Request('http://python.org

  • Python如何实现后端自定义认证并实现多条件登陆

    1.须知 JWT扩展的登录视图,在收到用户名与密码时,也是调用Django的认证系统Auth模型中提供的**authenticate()**来检查用户名与密码是否正确. 我们可以通过修改Django认证系统的认证后端(主要是authenticate方法)来支持登录账号既可以是用户名也可以是手机号. `authenticate(self, request, username=None, password=None, **kwargs)`方法的参数说明: - request 本次认证的请求对象 -

  • Django通过自定义认证后端实现多种登录方式验证

    前言 我们见到几乎所有的 Web 网站或者手机 App 也好,它们的最终目的都是要留住用户,提升自己网站的用户注册量,所以说用户的概念也必须深入到每一个程序开发者的心中.而权限呢?它限制了用户可以拥有哪些功能,比如说某项只有付费会员才可以观看的教程,这就用到了用户的权限设置,可以一言一概之,用户的实现业务系统中的数据隔离,而权限则限定了用户可以使用的哪些功能. 那么,Django 提供的用户认证系统如何在项目中进行应用呢?在本节我们将给大家介绍如何使用用户认证系统,实现我们业务场景中常见的多种登

  • Django自定义认证方式用法示例

    本文实例讲述了Django自定义认证方式.分享给大家供大家参考,具体如下: 创建登录应用 首先创建一个新的login app,用来存放认证用到代码 python manage.py startapp login 修改settings.py中的认证项 AUTHENTICATION_BACKENDS = ( 'login.auth.UsernamePasswordAuth', ) 自定义认证类 在login app下创建auth.py文件,内容如下 #coding:utf-8 from django

  • Python Django 前后端分离 API的方法

    步骤 根据之前的文章已经搭建好 Django的目录 开始流程 运行 manage.py 文件 # 创建一个app startapp ulb_manager settings.py 文件中 设置 INSTALLED_APPS = [ # 加入这句话 'apps.ulb_manager', ] MIDDLEWARE_CLASSES = [ # 关闭掉跨域的一些验证,注释掉下面这句话 # 'django.middleware.csrf.CsrfViewMiddleware', ] urls.py 文件

  • spring security自定义认证登录的全过程记录

    spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为: 1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: 2.使用数据库,根据spring security默认实现代码设计数据库,也就是说数据库已经固定了,这种方法不灵活,而且那个数据库设计得很简陋,实用性差: 3.spring security和Acegi不同,它不能修改默认filter了,但支持插入filter,所以根据这个,我们可以插入自己的f

  • Laravel认证原理以及完全自定义认证详解

    前言 Laravel 默认的 auth 功能已经是很全面了,但是我们也经常会碰到一些需要自定义的一些情况,比如验证的字段和默认的不匹配,比如需要能够同时满足 user name 和 email 认证等等.如何创建一个完全自定义的认证呢?相比一个教程,我更倾向于介绍一下工作原理,这样在自己修改或自定义的过程中更得心应手. Authenticatable 接口 Illuminate\Contracts\Auth\Authenticatable Authenticatable 定义了一个可以被用来认证

  • Python学习笔记之自定义函数用法详解

    本文实例讲述了Python学习笔记之自定义函数用法.分享给大家供大家参考,具体如下: 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print()等.也可以创建用户自定义函数. 函数定义 函数定义的简单规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须放在圆括号中间 函数内容以冒号起始,并且缩进 若有返回值,Return[expression] 结束函数:不带return 表达式相当于返回None 函数通常使用三个单引

  • python+opencv3生成一个自定义纯色图教程

    一. 图像在计算机中存储为矩阵.矩阵上一个点表示一个像素.若矩阵由一系列0-255的整数值组成,则表现为灰度图.便于理解,以下贴出代码: import cv2 import numpy as np img = np.ones((3,3),dtype=np.uint8)#random.random()方法后面不能加数据类型 #img = np.random.random((3,3)) #生成随机数都是小数无法转化颜色,无法调用cv2.cvtColor函数 img[0,0]=100 img[0,1]

  • 在python中利用pycharm自定义代码块教程(三步搞定)

    当我们在使用pycharm时,输入特殊的关键字会有提示,然后按enter就可以自动补全,如果我们经常需要输出重复的代码时,能否也利用这种方法来自动补全呢? 下面我们就来利用pycharm自定义代码块: 1.打开pycharm中file下的setting,找到Editor下面的Live Templates ,右侧就会出现各种语言的代码块,我们选择Python,点击右侧的"+",选择Live Template 2.Abbreviation就是你自定义代码块的名字,Description是描

  • 用Python开发app后端有优势吗

    app后端开发学Python. Python的优点: 1.简单易学 Python 编程语言最大的优点之一,是其具有伪代码的特质,它可以让我们在开发 Python 程序时,专注于解决问题,而不是搞明白语言本身. 2.开源 Python 是 FLOSS(自由/开源源码软件)之一,简单地理解就是,用户使用 Python 进行开发和发布自己编写的程序,不需要支付任何费用,也不用担心版权问题,即使作为商业用途,Python 也是免费的. 开源正在成为软件行业的一种发展趋势,现在有很多商业软件公司都开始将自

随机推荐