django用户认证系统——自定义认证后台8
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的更多相关文章
- Django认证系统auth认证
使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...
- django中怎么使用自定义管理后台xadmin
django中怎么使用自定义管理后台xadmin 2018年05月19日 15:48:08 LH_python 阅读数:1001 首先创建基本的django项目,配置好基本的model ,url, ...
- Django用户登陆以及跳转后台管理页面3
Django用户登陆以及跳转后台管理页面1http://www.cnblogs.com/ujq3/p/7891774.html Django用户登陆以及跳转后台管理页面2http://www.cnbl ...
- Django用户登陆以及跳转后台管理页面2
请先写好以下,再来替换文件 Django用户登陆以及跳转后台管理页面1http://www.cnblogs.com/ujq3/p/7891774.html from django.shortcuts ...
- django(权限、认证)系统——自定义UserProfile储存User额外信息
上篇文章我们引出了Django内置的权限控制系统,讲了安装,和最核心和基本的User模型的API和其Manager的API. 接下来我们继续深入下去,使用User对象做一些事情,首先当然就是创建一个U ...
- Django(62)自定义认证类
前言 如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的 源码分析 源码的入口在APIView.py文件下的di ...
- DRF认证、自定义认证和权限、自定义权限
源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...
- django用户投票系统详解
投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...
- Django用户登陆以及跳转后台管理页面1
"""S14Djngo URL Configuration The `urlpatterns` list routes URLs to views. For more i ...
随机推荐
- hibernate 多对多双向关联
package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persistenc ...
- JavaMelody、prob系统监控工具使用配置
分类: 工具 2014-04-23 14:41 1857人阅读 评论(1) 收藏 举报 目录(?)[+] 项 目开发结束了,需要做一下压力测试,就使用apache自带的ab程序进行压力测试,300个并 ...
- java之TCP(Socket,serverSocket)实例
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- jQuery源代码学习:经常使用正則表達式
转载自:http://nuysoft.iteye.com/blog/1217898 经常使用的数字正则(严格匹配) 正则 含义 ^[1-9]\d*$ 匹配正整数 ^-[1-9]\d*$ 匹配负整数 ^ ...
- FTP服务搭建与配置
FTP介绍 大企业用的基本都是自动化发布工具,会用GIT企业发布的版本上传到服务器, 使用vsftpd搭建ftp服务(上) http://blog.csdn.net/qq_26941173/artic ...
- python3安装scrapy问题解决
scrapy py3.5安装 pip install scrapy 直接安装失败 第一个错误 building 'lxml.etree' extension 使用 pip install lxml 安 ...
- python安装scrapy小问题总结
AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'
- netty4.1.32 pipeline的添加顺序和执行顺序
本文只想讨论一下pipeline的执行顺序问题,因为这个搞不明白就不知道先添加编码还是解码,是不是可以混淆添加等等一系列事情 pipeline.addLast(new outboundsHandler ...
- 斑马Zebra ZPLII指令集中文说明解释
我们最常用的斑马(Zebra)条码打印机,应用ZPLII命令来控制打印,说明书中有每条指令的详细说明及相关示例,下面是各指令的中文释义: ^A 对Zebra内置点阵字体缩放 ^A(可缩放/点阵字体 ...
- 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)
一.问题描述 问题: 使用<pg:param name="key" />标签传递中文参数时,会有乱码. 原因: 因为它默认是用gb2312来对添加的参数进行编码,如果你 ...