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

这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下

将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的Django框架与认证系统整合的方法的更多相关文章

  1. django之auth认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  2. Django组件之认证系统

      Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...

  3. Python的Django框架中的Context使用

    Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...

  4. django自定义user认证系统

    第一种,彻底推翻django的user认证系统,重新定义我们想要的字段 from django.contrib.auth.models import AbstractBaseUser,Permissi ...

  5. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  6. Python的Django框架中的Cookie相关处理

    Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...

  7. 如何使用Python的Django框架创建自己的网站

    如何使用Python的Django框架创建自己的网站 Django建站主要分四步:1.创建Django项目,2.将网页模板移植到Django项目中,3.数据交互,4.数据库 1创建Django项目 本 ...

  8. Python的Django框架中的URL配置与松耦合

    Python的Django框架中的URL配置与松耦合 用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比 ...

  9. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

随机推荐

  1. RedisTemplate和StringRedisTemplate的区别

    今天springboot项目中用redis的时候,遇到了一个问题,用RedisTemplate这个类向redis中存储数据的时候,明明数据存进去了,也可以取出来,但是rdm就是看不到key的值,网上的 ...

  2. mysql双主模式方案

    MySQL双主(主主)架构方案   在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果 ...

  3. Max Tree

    Description Given an integer array with no duplicates. A max tree building on this array is defined ...

  4. Neo4j数据进行备份、还原

    一.neo4j备份方式 neo4j数据库的备份还原分为两种: offline 和 online. Offline backup - dump Dump a database into a single ...

  5. luogu 1593

    $Answer = A ^ B $ 的因子之和 将 $A$ 进行质因数分解$A = p_1 ^ {a_1} P_2 ^ {a_2} p_3 ^ {a_3} \cdots p_k ^ {a_k}$ $A ...

  6. P4556 雨天的尾巴 线段树合并

    使用线段树合并,每个节点维护一棵权值线段树,下标为救济粮种类,区间维护数量最多的救济粮编号(下标).所以每个节点答案即为\(tre[rot[x]]\). 然后运用树上点的差分思想,对于分发路径\(u, ...

  7. windows使用强大的wget工具

    原文链接:https://www.cnblogs.com/hzdx/p/6432161.html wget下载地址:http://www.interlog.com/~tcharron/wgetwin. ...

  8. Jetbrain全栈最新激活方法(2019年及之前所有新老版本)

    随着2019版的到来,之前的永久激活教程也不生效了,所以今天为大家带来一种新的永久激活方式. 1.下载新版破解补丁 破解补丁传送门提取码:3e8j 点击传送门下载补丁文件 jetbrains-agen ...

  9. 开启php的PDO扩展,mysql扩展

    打开php.ini配置文件,找到extension=php_pdo.dll 和 extension=php_pdo_mysql.dll ,去掉前面“;”的注释,修改后的两行配置内容如下: extens ...

  10. python map() 的使用方法

    >>>def square(x) : # 计算平方数 ... ... >>> map(square, [,,,,]) # 计算列表各个元素的平方 [, , , , ...