前面我们在登录的时候,是通过输入用户名和密码来进行认证

user=authenticate(username=cd['username'],password=cd['password'])

这个是通过后台设置的django.contrib.auth.backends.ModelBackend来生效的。默认的ModelBackend通过数据库使用django.contrib.auth中的User模型(model)来认证(authentication)用户。

当你使用django.contrib.auth的authenticate()函数,Django会通过每一个定义在AUTHENTICATION_BACKENDS中的后台一个接一个地尝试认证(authentication)用户,直到其中有一个后台成功的认证该用户才会停止进行认证。只有所有的后台都无法进行用户认证(authentication),他或她才不会在你的站点中通过认证(authentication)。

Django提供了一个简单的方法来定义你自己的认证(authentication)后台。一个认证(authentication)后台就是提供了如下两种方法的一个类:

  • authenticate():将用户信息当成参数,如果用户成功的认证(authentication)就需要返回True,反之,需要返回False。
  • get_user():将用户的ID当成参数然后需要返回一个用户对象。

但是如果我们想通过其他方式进行认证,比如注册的邮箱来认证。我们就需要创建一个认证(authentication)后台让用户在我们的站点中使用他们e-mail替代他们的用户名来进行认证(authentication)。

在blog应用中添加一个authentication.py文件,代码如下:

from django.contrib.auth.models import User

class EmailAuthBackend(object):

def authenticate(self,username=None,password=None):

try:

user_list=User.objects.filter(email=username)

print len(user_list)

if len(user_list) > 1:

user=user_list[0]

else:

user=user_list

if user.check_password(password):

return user

return None

except User.DoesNotExist:

return None

def get_user(self,user_id):

try:

return User.objects.get(pk=user_id)

except User.DoesNotExist:

pass

return None

在这里通过user_list=User.objects.filter(email=username)得到所有通过email注册的用户。这里由于其面在新增用户的时候都是通过输入相同的email地址,所以这里采用了User.objects.filter函数,如果每个用户的邮箱地址不一样,则通过User.objects.get函数来获得用户就可以了。

以上代码完成了以下工作内容:

  • authenticate():我们尝试通过给予的e-mail地址获取一个用户和使用User模型(model)中内置的check_password()方法来检查密码。这个方法会对给予密码进行哈希化来和数据库中存储的加密密码进行匹配。
  • get_user():我们通过user_id参数获取一个用户。Django使用这个后台来认证用户之后取回User对象放置到持续的用户会话中。

编辑项目中的settings.py文件添加如下设置:

AUTHENTICATION_BACKENDS=(

'django.contrib.auth.backends.ModelBackend',

'blog.authentication.EmailAuthBackend'

)

通过这种设置,我们保留默认的ModelBacked用来保证用户仍然可以通过用户名和密码进行认证,接着我们包含进了我们自己的email-based认证(authentication)后台

那么在登录界面中,在username中输入用户名和邮箱都可以通过验证。

下面介绍第三方认证:

首先通过pip install social-auth-app-django 安装社交框架

INSTALLED_APPS = (

'social_django',  )

在INSTALLED_APPS中添加应用(settings.py)

更新数据库:

python manage.py migrate

在认证后端添加QQ认证以及QQ互联的key和id(settings.py). 注意:这个key和id需要到QQ去申请

AUTHENTICATION_BACKENDS = (

'social_core.backends.qq.QQOAuth2',

SOCIAL_AUTH_QQ_KEY = 'your qq app id,like some number,for examle 230402020' # QQ APP_ID

SOCIAL_AUTH_QQ_SECRET = 'you qq seckey ,combined by letter with number,for examle: f123bas324' # QQ SECRECT_KEY

SOCIAL_AUTH_QQ_USE_OPENID_AS_USERNAME = True

添加根urls.py的URL路由

urlpatterns = [

url('', include('social_django.urls', namespace='social'))

]

在需要登录的地方加上如下代码:

<a href="{% url "social:begin" "qq" %}">QQ登录 <!-- 这个登录标识注意要满足QQ互联的要求 --></a>

settings.py中的TEMPALTES如下:

TEMPLATES = [

{

'OPTIONS': {

'context_processors': [

'social_django.context_processors.backends',

'social_django.context_processors.login_redirect',

]

}

}

]

Django之博客系统:自定义认证的更多相关文章

  1. Django(博客系统):基于pycharm如何一个django工程下创建多个app

    背景:通常我们创建一个django系统时,为了把业务模块划分清楚往往会把一个独立的业务模块放到一个app中,如果多个独立的业务模块就会创建多个app,一般情况下为了更好的管理这些app,会把他们都存放 ...

  2. Django练习——博客系统小试

    在上一篇博客Todolist的基础上(http://blog.csdn.net/hcx25909/article/details/24251427),本周继续进行实践,这次我要搭建一个简单的博客系统. ...

  3. 纯django开发博客系统

    企业级教程:纯django开发博客系统 1.视频教程 https://www.duanshuilu.com/ 2.教程文档 https://www.duanshuilu.com/ 0.课程简介1.简价 ...

  4. 【django之博客系统开发】

    一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...

  5. Django之博客系统搭建一

    前面已经介绍了django的各种用法,从这一章开始,将实际搭建一个blog系统. 首先我们需要设计blog的模型,在models.py中添加如下内容 # -*- coding: utf-8 -*- f ...

  6. Django之博客系统邮件分享博客

    在上一章中,我们创建了一个基础的博客应用,我们能在http://127.0.0.1:8000/blog/显示我们的博客.在这一章我们将尝试给博客系统添加一些高级的特性,比如通过email来分享帖子,添 ...

  7. Django之博客系统:自定义模板标签

    Django提供了很多内置的模板标签比如{% if %}或者{% block %}Django也允许你创建自己的模板标签(template tags)来执行自定义的动作.当你需要在你的模板中添加功能而 ...

  8. Django之博客系统:用户登陆

    使用django有一个好处就是有各种各样的框架可以拿来直接使用.相比flask,django自带的框架确实要多很多.比如这一章就要介绍的用户登录.Django拥有一个内置的认证(authenticat ...

  9. Django之博客系统:增加评论

    3既然是博客,那肯定就有留言评论系统.在这一章就来建立一个评论系统. 1 创建一个模型来保存评论 2 创建一个表单来提交评论并且验证输入的数据 3 添加一个视图函数来处理表单和保存新的评论到数据库 4 ...

  10. Django之博客系统:增加标签

    一般在发表博客后会给每个帖子加上一个标签.类似帖子关键字的功能.在这一章中来看下如何给博客添加标签功能(tagging) 添加标签需要集成第三方的Django标签应用来完成这个功能.django-ta ...

随机推荐

  1. Xaml中string(字符串)常量的定义以及空格的处理

    (1)基本用法 xaml中可以实例化各种对象,比如在ResourceDictionary中定义字符串常量: <ResourceDictionary xmlns="http://sche ...

  2. Xmodem通信协议实例

    在工作时串口通信的过程中需要传输文件,这里就就需要使用通信协议,此时选择的是Xmodem协议作简要研究 1.什么是Xmodem协议 Xmodem协议是串口通信中广泛使用到的异步文件传输协议.以128字 ...

  3. Oracle之into

    ), NVL() INTO SALE_ID, STORE_ID FROM SALEFROMSTORE WHERE ORDERID = IN_ORDER_ID; 这里要注意,into的时候是一个sele ...

  4. Day3-Python基础3--默认参数和参数组

    一.默认参数 先看下下面的代码: def stu_register(name,age,country,course): print("----注册学生信息------") prin ...

  5. Generate web.xml deployment descriptor

    eclipse 使用tomcat7.0建立Dynamic Web Project 时,next至步骤“Web Module”,此时勾选选项“Generate web.xml deployment de ...

  6. C Primer Plus学习笔记(八)- 函数

    函数简介 函数(function)是完成特定任务的独立程序代码单元 使用函数可以省去编写重复代码的苦差,函数能让程序更加模块化,提高程序代码的可读性,更方便后期修改.完善 #include <s ...

  7. Vue2.0+Webpack+Element+Axios+vueRouter技术栈使用过程总结

    搭建项目架构 目采用Webpack+Vue-router的架构方式,开始安装(一切操作都在windows系统上完成) 1.按Win+R,然后在文本框中输入cmd,回车打开命令行,输入vue-cli安装 ...

  8. elastic(8)版本控制

    转自: http://www.cnblogs.com/AK47Sonic/p/7563393.html elasticsearch 版本控制: 内部版本控制 外部版本控制 内部版本控制: 内部版本会检 ...

  9. Linux 2.6 中的文件锁

    简介: 本文的目的是想帮助读者理清 Linux 2.6中文件锁的概念以及 Linux 2.6 都提供了何种数据结构以及关键的系统调用来实现文件锁,从而可以帮助读者更好地使用文件锁来解决多个进程读取同一 ...

  10. unity3D中制作天空盒(Skyboxes)

    1.首先制作图片,需要把图片用Ps制作成psd格式,制作6张 2.把6个psd文件导入工程目录 Assets下, 3.在project属性列表中选中Assets,单击鼠标右键选择 Create —&g ...