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

 更新时间:2015年07月24日 12:05:59   投稿:goldensun  
这篇文章主要介绍了将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自动发邮件库yagmail的示例代码

    python自动发邮件库yagmail的示例代码

    本篇文章主要介绍了python自动发邮件库yagmail的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Python实现的扫码工具居然这么好用!

    Python实现的扫码工具居然这么好用!

    二维码作为一种信息传递的工具在当今社会发挥了重要作用.从手机用户登录到手机支付,生活的各个角落都能看到二维码的存在.那你知道二维码是怎么解析的吗?有想过自己实现一个扫码工具吗?如果想的话就继续看下去吧!需要的朋友可以参考下
    2021-06-06
  • python安装scipy的步骤解析

    python安装scipy的步骤解析

    这篇文章主要介绍了python安装scipy的步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python实现在线音乐播放器

    Python实现在线音乐播放器

    这篇文章主要为大家详细介绍了Python实现在线音乐播放器的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • python装饰器decorator介绍

    python装饰器decorator介绍

    这篇文章主要介绍了python装饰器decorator介绍,decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能,需要的朋友可以参考下
    2014-11-11
  • Selenium 4.2.0 标签定位8种方法详解

    Selenium 4.2.0 标签定位8种方法详解

    这篇文章主要介绍了Selenium 4.2.0 标签定位8种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • PyTorch中tensor.backward()函数的详细介绍及功能实现

    PyTorch中tensor.backward()函数的详细介绍及功能实现

    backward() 函数是PyTorch框架中自动求梯度功能的一部分,它负责执行反向传播算法以计算模型参数的梯度,这篇文章主要介绍了PyTorch中tensor.backward()函数的详细介绍,需要的朋友可以参考下
    2024-02-02
  • Python作用域与名字空间源码学习笔记

    Python作用域与名字空间源码学习笔记

    这篇文章主要为大家介绍了Python作用域与名字空间的源码学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2022-05-05
  • Python读取视频的两种方法(imageio和cv2)

    Python读取视频的两种方法(imageio和cv2)

    这篇文章主要为大家详细介绍了Python读取视频的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python3实现UDP协议的服务器和客户端

    python3实现UDP协议的服务器和客户端

    这篇文章主要为大家详细介绍了python3实现UDP协议的服务器和客户端,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论