django使用email进行身份验证(转载)
版权所有,转载请注明出处:http://guangboo.org/2013/03/27/authentication-using-email-in-django
django自带的验证功能免去了我们的大量工作,它提供了验证、授权相关的接口,我们只有非常少的代码就可以实现,但是django自带的身份验证的方法只能使用用户名来进行验证,如果要想使用email进行验证的话,就需要自己编写一些代码了。
为使得我们能在使用django提供的验证功能时,能够使用email进行身份验证,本文提出一个简单的解决方案,使尽量少的编写代码,同时又能实现上面的功能。本文使用环境django(1.4.2)+python(2.7.3)。
django的身份验证授权等功能在模块django.contrib.auth模块下,该模块下提供了默认的验证表单,修改密码,找回密码等表单,验证,登录接口等。其中views.py下提供了login和logout方法,用户登录和注销,当然还包含其他的如登录跳转,重置密码,修改密码等。这些view方法都有很多的参数,都是为了扩展而添加的,这些方法我们可以直接拿来使用,如果我们不考虑email验证或登录界面的话,就可以使用如下代码:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^login/$', 'django.contrib.auth.views.login', name = 'login'),
)
只要将上面的三行代码拷贝到urls.py文件中,就可以实现login的功能,只是登录界面是admin的登录界面,并且使用默认的用户名和密码进行验证。如果我们查看django.contrib.auth.views.login方法的源代码的话,就会发现login的方法签名为:
def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None)
login方法有很多参数,并且都是有默认值的,对我们来说,最常用的就是template_name参数了,我们可以这样修改urls.py文件,实现登录界面的自定义。
urlpatterns = patterns('',
url(r'^login/$', 'django.contrib.auth.views.login', {'template_name':'account/long.html'}, name =
'login'),
)
与前面的代码比较,在url方法中添加了一个参数 {'template_name':'account/long.html'},该参数就会传递给login方法,从而就实现修改登录界面的目的了。也许你会疑惑,为什么login方法中为什么没有身份验证的代码,其实身份验证的功能是实现在form中的,就是默认的身份验证表单AuthenticationForm,我们继续阅读AuthenticationForm表单的源代码:django.contrib.auth.forms.AuthenticationForm,我们会发现身份验证功能的实现,是在方法clean中,代码如下:
def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password') if username and password:
self.user_cache = authenticate(username=username,
password=password)
if self.user_cache is None:
raise forms.ValidationError(
self.error_messages['invalid_login'])
elif not self.user_cache.is_active:
raise forms.ValidationError(self.error_messages['inactive'])
self.check_for_test_cookie()
return self.cleaned_data
其中authenticate方法就是我们要找的验证代码,当然到此我们已经找到验证的实现,我们就可以重写一个验证表单,重新实现clean方法就可以实现我们自己的验证方式--使用email验证,然后在
{'template_name':'account/long.html'}参数中添加自定义的验证表单类,如:
urlpatterns = patterns('',
url(r'^login/$', 'django.contrib.auth.views.login',
{'template_name':'account/long.html','authentication_form':CustomAuthForm}, name = 'login'),
)
其中CustomAuthForm是我们自定义的验证表单,我们可以参考django自动的AuthenticationForm的实现编写我们自己的CustomAuthForm类,这里就不在给出实例,这是一种方法。
另一种方法,我们定义一个backend类,如下:
# -*- coding:utf-8 -*-
# backends.py from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User class EmailCheckModelBackend(ModelBackend):
def authenticate(self, username = None, password = None, is_staff = None):
try:
user = User.objects.get(email = username)
if user.check_password(password):
if is_staff is not None:
if user.is_staff == is_staff:
return user
else:
return None
return user except User.DoesNotExist:
return None
并且在settings.py文件中添加如下代码即可:
AUTHENTICATION_BACKENDS = ('account.backends.EmailCheckModelBackend',)
需要说明的是,authenticate方法签名中的原有参数名称最后不要修改,因为admin的验证方式也会使用该backed,如果你仔细观察AuthenticationForm的clean方法的话,authenticate方法调用是传递了参数名的,如果我们将username参数名该成了email或者其他名称的话,admin就无法登陆了。
django使用email进行身份验证(转载)的更多相关文章
- 基于token的后台身份验证(转载)
几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...
- [转载]SQL Server 2008 R2安装时选择的是windows身份验证,未选择混合身份验证的解决办法
安装过程中,SQL Server 数据库引擎设置为 Windows 身份验证模式或 SQL Server 和 Windows 身份验证模式.本文介绍如何在安装后更改安全模式. 如果在安装过程中选择&q ...
- 【转载】IdentityServer4 使用OpenID Connect添加用户身份验证
使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...
- MVC身份验证及权限管理(转载)
from https://www.cnblogs.com/asks/p/4372783.html MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供 ...
- [转载]基于 Token 的身份验证
作者:王皓发布于:2015-08-07 22:06更新于:2015-08-07 22:07 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twit ...
- ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...
- ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi身份验证问题解决方案
在我们的整体bs框架当中前端采用的是MVC+WebApi的处理方式.WebApi使用起来确实很方便但也会有新的麻烦事,就是身份验证. 如果没有启用身份认证,那么任何匿名用户只要知道了我们服务的url, ...
- NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
NET Core 1.1 静态文件.路由.自定义中间件.身份验证简介 概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要 ...
随机推荐
- io分析神器blktrace
一.概述 [许久之前就用过blktrace,现整理如下] 从linux 一个完整的IO入手分析: 一个I/O请求进入block layer之后,可能会经历下面的过程: Remap: 可能被DM(Dev ...
- 【jsp】配置错误页面
1,使用JSP方式 如果配置是Jsp时,需要把isErrorPage设置为true, 以及设置 <%@ page language="Java" contentType=&q ...
- SQL临时表
临时表就是那些名称以井号 (#) 开头的表.如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表.临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内. 临时表有 ...
- Flume与Logstash比较
Flume与Logstash相比,个人的体会如下: Logstash比较偏重于字段的预处理:而Flume偏重数据的传输: Logstash有几十个插件,配置灵活:FLume则是强调用户的自定义开发(s ...
- 简单获取cpu使用率,以及后台运行的问题
做了一个运维平台,有一个功能定时执行一个脚本,获取cpu使用率和内存使用情况到监控平台. 获取cpu使用率使用的是top中的信息.直接运行没有问题.通过nohup xxx.sh & 之后获取不 ...
- Android开发中的神坑和知识点记录
1.SDK Manager.exe闪退的问题 http://blog.csdn.net/fambit025/article/details/26984345 1.找到android.bat,在源码处找 ...
- 转 Kubernetes 入门 概念理解
你闺女也能看懂的插画版Kubernetes指南 原创 2016-06-30 作者 周小璐 译 编者按:Matt Butcher是Deis的平台架构师,热爱哲学,咖啡和精雕细琢的代码.有一天女儿走进书 ...
- RAID简介[zz]
RAID 0 是指磁盘分段(Disk Striping)技术其实现方法为将数据分段,同时写到多个磁盘上.其优点是磁盘可以实现并行的输入和输出,提高磁盘读写速度,但是这种技术无容错性能:RAID 1是指 ...
- 微信小程序JS导出和导入
1. 导出 1.1 方法和变量导出(写在被导出方法和变量的js文件) module.exports = { variable: value, method : methodName } 1.2 cla ...
- [转]cubemap soft shadow
https://community.arm.com/graphics/b/blog/posts/dynamic-soft-shadows-based-on-local-cubemap