`
xiaoheliushuiya
  • 浏览: 423311 次
文章分类
社区版块
存档分类
最新评论

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-as-username, 使用电子邮件地址而不是用户名进行用户身份验证.zip

    django-email-as-username, 使用电子邮件地址而不是用户名进行用户身份验证 Django 电子邮件作为用户名使用电子邮件地址而非用户名进行用户身份验证。 作者:汤姆 Christie,@_tomchristie 。: django-email-login...

    Python库 | django-email-authenticator-0.4.7.tar.gz

    其中,“django-email-authenticator-0.4.7”是一个专门针对Django的邮箱验证库,它为我们提供了一种强大的用户身份验证机制。 Django-email-authenticator-0.4.7的核心功能是通过电子邮件验证用户的注册信息,确保...

    PyPI 官网下载 | django-email-registration-0.1.0.tar.gz

    要使用`django-email-registration`,首先需要从PyPI官网下载`django-email-registration-0.1.0.tar.gz`压缩包,然后解压并使用pip进行安装。在Django项目中,将该库添加到`settings.INSTALLED_APPS`列表中,并配置...

    django-use-email-as-username:Django应用程序,使用电子邮件作为用户名进行用户身份验证

    Django使用电子邮件作为用户名 Django应用程序,用于将电子邮件用作用户身份验证的用户名。特征没有用户名字段的自定义用户模型使用电子邮件作为用户名包含django-admin命令以快速安装对于新的Django项目和用户模型...

    Django-Email-Sender:根据业务需求自动执行带有某些自定义功能的电子邮件发送过程

    总的来说,Django-Email-Sender 是一个强大且灵活的工具,它结合了 Django 的优点和 Python 的简洁性,为开发者提供了自动化电子邮件发送的能力,同时允许他们根据业务需求进行深度定制。通过深入理解和使用这些核心...

    Django中的用户身份验证示例详解

    在Django框架中,用户身份验证是Web应用中不可或缺的一部分,它确保了只有授权的用户才能访问特定资源。本文将详细讲解Django中用户身份验证的相关知识,包括用户创建与修改、用户登录与注销以及用户权限管理。 ...

    login-email-django:使用Django中电子邮件字段的登录身份验证系统

    Django是用Python编写的,它提供了强大的Web开发工具,其中包括一套完整的身份验证和授权系统。让我们一起看看如何利用Django的内置功能以及进行一些自定义设置,以便用户能够通过电子邮件而非传统的用户名来登录。 ...

    django使用LDAP验证的方法示例

    本文档详细介绍了如何在 Django 项目中集成 LDAP 身份验证,并提供了实际的配置示例和步骤指南。 #### 一、安装所需依赖 为了在 Django 应用中实现 LDAP 身份验证,首先需要安装两个必要的 Python 库: 1. **...

    PyPI 官网下载 | django-rest-email-auth-2.1.0.tar.gz

    2. 通过REST API接口进行身份验证,可能包括JSON Web Token(JWT)的生成和验证。 3. 邮件发送功能,用于发送验证邮件和密码重置链接。 4. 可能有自定义的认证后端,以适应Django的认证系统。 5. 提供错误处理和响应...

    django-rest-email-auth:Django应用程序通过电子邮件处理身份验证和注册

    使用用户的任何已验证电子邮件地址进行身份验证 新用户注册 使用经过验证的电子邮件重设密码 兼容性 Python: 3.6或更高版本 Django:版本2.2到3.1 Django REST Framework: 3.10或更高版本 增加功能 该软件包主要...

    django1.11.1

    这部分内容介绍了如何使用 REMOTE_USER 环境变量进行用户身份验证。 **2. 编写自定义 django-admin 命令 (Writing custom django-admin commands)** 这部分内容介绍了如何编写自定义的 django-admin 命令,以便...

    Djangonautic:使用Django-python的Web身份验证系统

    **Django Python Web身份验证系统详解** Django是Python领域中最受欢迎的Web开发框架之一,以其高效、安全和可扩展性著称。在Django中,实现Web身份验证是构建任何应用程序的基础,它允许我们控制用户访问权限,...

    Django1.6 官方文档

    - **使用 REMOTE_USER 进行身份验证 (Authentication using REMOTE_USER)** - **编写自定义 django-admin 命令 (Writing custom django-admin commands)** - **编写自定义模型字段 (Writing custom model fields)...

    django-allauth-2fa:Django Allauth的两因素身份验证

    `django-allauth-2fa` 是一个用于Django框架的扩展,它为流行的 `django-allauth` 库增加了两因素身份验证(2FA)功能。在当前的网络安全环境中,用户账户的安全性至关重要,而2FA可以显著增强用户登录的安全级别。2...

    Python库 | django_username_email-2.1.0-py2.7.egg

    这款库主要关注用户身份验证过程中的用户名和电子邮件管理,对于Django后端开发而言,是提高效率和增强用户体验的重要工具。 首先,我们需要理解Django,这是一个高级的Python Web框架,用于快速开发安全且可维护的...

    DataEntry:使用django和自定义身份验证系统制作的网站

    Django自带的身份验证系统已经相当强大,但在某些情况下,可能需要根据业务需求进行定制。自定义身份验证过程通常包括以下几个步骤: 1. 创建认证后端:在`auth.py`或者专门的模块中创建一个类,继承自`django....

    django-docs-1.6文档API

    中间件可以用来处理跨站请求伪造(CSRF)、日志记录、身份验证等任务,为应用程序添加全局行为。 **管理命令(Management Commands)** Django 提供了一个命令行界面,允许开发者创建自定义管理命令,用于执行如...

    django-rest-framework-cn

    它基于Django Web框架,利用其强大的特性来处理复杂的数据库操作、身份验证机制及权限控制等。DRF提供了丰富的功能集,包括序列化支持、身份验证、权限管理、过滤和分页等,能够快速搭建高性能RESTful API服务。 ##...

    django-libtech-emailuser:在Django +1.5中作为用户名发送电子邮件

    有很多应用程序可以使用Django 1.5之前的电子邮件地址进行身份验证。 随着Django 1.5的问世,Django核心团队通过设置AUTH_USER_MODEL使得使用任何模型进行身份验证变得非常容易。 不幸的是,如果您想要一个模型与...

    did_django_user_app:使用Django Web框架的DID编码用户身份验证应用程序

    app 具有基本用户身份验证的Django项目cd到开发目录mkvirtualenv did_django_user_app mkdir did_django_user_app 将存储库克隆到新目录点安装-r requirements.txt 使用您的电子邮件API信息更新settings.py EMAIL_...

Global site tag (gtag.js) - Google Analytics