将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之赋值,简单也不简单
Sep 24 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
Jan 22 Python
Python Socket传输文件示例
Jan 16 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
python numpy中setdiff1d的用法说明
Apr 22 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
一个简单的PHP入门源程序
2006/10/09 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php猜单词游戏
2015/09/29 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
常用简易JavaScript函数
2009/04/09 Javascript
js对象数组按属性快速排序
2011/01/31 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
python类参数self使用示例
2014/02/17 Python
python文件写入write()的操作
2019/05/14 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
教师求职自荐信
2014/03/09 职场文书
防卫过当辩护词
2015/05/21 职场文书
导游词之阆中古城
2019/12/23 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python