将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实现每次处理一个字符的三种方法
Oct 09 Python
Python实用日期时间处理方法汇总
May 09 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
python操作kafka实践的示例代码
Jun 19 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
Python tkinter实现日期选择器
Feb 22 Python
python爬虫之爬取笔趣阁小说
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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
解析php中获取url与物理路径的总结
2013/06/21 PHP
php eval函数一句话木马代码
2015/05/21 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
Python while 循环使用的简单实例
2016/06/08 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
Python如何安装第三方模块
2020/05/28 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
什么是数组名
2012/05/10 面试题
心理健康教育制度
2014/01/27 职场文书
导购员的岗位职责
2014/02/08 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
市场营销策划方案
2014/06/11 职场文书
项目申请汇报材料
2014/08/16 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android