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


Posted in Python onJuly 24, 2015

将Django与其他现有认证系统的用户名和密码或者认证方法进行整合是可以办到的。

例如,你所在的公司也许已经安装了LDAP,并且为每一个员工都存储了相应的用户名和密码。 如果用户在LDAP和基于Django的应用上拥有独立的账号,那么这时无论对于网络管理员还是用户自己来说,都是一件很令人头痛的事儿。

为了解决这样的问题,Django认证系统能让您以插件方式与其他认证资源进行交互。 您可以覆盖Diango默认的基于数据库的模式,您还可以使用默认的系统与其他系统进行交互。
指定认证后台

在后台,Django维护了一个用于检查认证的后台列表。 当某个人调用 django.contrib.auth.authenticate() (如14章中所述)时,Django会尝试对其认证后台进行遍历认证。 如果第一个认证方法失败,Django会尝试认证第二个,以此类推,一直到尝试完。

认证后台列表在AUTHENTICATION_BACKENDS设置中进行指定。 它应该是指向知道如何认证的Python类的Python路径的名字数组。 这些类可以在你Python路径的任何位置。

默认情况下,AUTHENTICATION_BACKENDS被设置为如下:

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

那就是检测Django用户数据库的基本认证模式。

AUTHENTICATION_BACKENDS的顺序很重要,如果用户名和密码在多个后台中都是有效的,那么Django将会在第一个正确匹配后停止进一步的处理。
编写认证后台

一个认证后台其实就是一个实现了如下两个方法的类: get_user(id) 和 authenticate(**credentials) 。

方法 get_user 需要一个参数 id ,这个 id 可以是用户名,数据库ID或者其他任何数值,该方法会返回一个 User 对象。

方法 authenticate 使用证书作为关键参数。 大多数情况下,该方法看起来如下:

class MyBackend(object):
  def authenticate(self, username=None, password=None):
    # Check the username/password and return a User.

但是有时候它也可以认证某个短语,例如:

class MyBackend(object):
  def authenticate(self, token=None):
    # Check the token and return a User.

每一个方法中, authenticate 都应该检测它所获取的证书,并且当证书有效时,返回一个匹配于该证书的 User 对象,如果证书无效那么返回 None 。 如果它们不合法,就返回None。

Django管理系统紧密连接于其自己后台数据库的 User 对象。 实现这个功能的最好办法就是为您的后台数据库(如LDAP目录,外部SQL数据库等)中的每个用户都创建一个对应的Django User对象。 您可以提前写一个脚本来完成这个工作,也可以在某个用户第一次登陆的时候在 authenticate 方法中进行实现。

以下是一个示例后台程序,该后台用于认证定义在 setting.py 文件中的username和password变量,并且在该用户第一次认证的时候创建一个相应的Django User 对象。

from django.conf import settings
from django.contrib.auth.models import User, check_password

class SettingsBackend(object):
  """
  Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.

  Use the login name, and a hash of the password. For example:

  ADMIN_LOGIN = 'admin'
  ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
  """
  def authenticate(self, username=None, password=None):
    login_valid = (settings.ADMIN_LOGIN == username)
    pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
    if login_valid and pwd_valid:
      try:
        user = User.objects.get(username=username)
      except User.DoesNotExist:
        # Create a new user. Note that we can set password
        # to anything, because it won't be checked; the password
        # from settings.py will.
        user = User(username=username, password='get from settings.py')
        user.is_staff = True
        user.is_superuser = True
        user.save()
      return user
    return None

  def get_user(self, user_id):
    try:
      return User.objects.get(pk=user_id)
    except User.DoesNotExist:
      return None

更多认证模块的后台, 参考Django文档。

Python 相关文章推荐
在Python中操作时间之mktime()方法的使用教程
May 22 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
Python中property函数用法实例分析
Jun 04 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python实现字符串匹配的KMP算法
Apr 04 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
python中实现词云图的示例
Dec 19 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
详解NumPy中的线性关系与数据修剪压缩
May 25 Python
Django与遗留的数据库整合的方法指南
Jul 24 #Python
简介Django中内置的一些中间件
Jul 24 #Python
Python字符串转换成浮点数函数分享
Jul 24 #Python
详解Python的Django框架中的中间件
Jul 24 #Python
浅谈Python的Django框架中的缓存控制
Jul 24 #Python
详解Django缓存处理中Vary头部的使用
Jul 24 #Python
解读Django框架中的低层次缓存API
Jul 24 #Python
You might like
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
python实现八大排序算法(1)
2017/09/14 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
授权委托书格式范文
2014/08/02 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
2014年度个人总结范文
2015/03/09 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP