指定认证后端

Django维护一个”authentication backends”的列表用来测试认证。当调用 django.contrib.auth.authenticate() — Django将尝试所有的认证后端。如果第一个认证方法失败了,Django将会继续尝试第二个,直到所有的都被尝试过。
认证后端的列表在 AUTHENTICATION_BACKENDS 设置。内容应该是包含Python路径的元组。默认情况下, AUTHENTICATION_BACKENDS 设置为
(‘django.contrib.auth.backends.ModelBackend’,),这是检测Django用户数据库的基本认证方案。
按照 AUTHENTICATION_BACKENDS 的排列顺序,如果同样的用户名和密码在第一次就匹配了,那么Django将停止处理后面的东西。

编写一个认证后端

一个认证后端是一个类,实现了2个方法:get_user(id) 和 authenticate(**credentials) 。
get_user 方法接受一个 id (可以是用户名,数据库ID或者其他的什么)并且返回一个 User 对象。
authenticate 方法接受字典型认证信息的参数。大多情况下是如下样子的
class MyBackend:
 def authenticate(username=None, password=None):
 # 检测用户名和密码,并返回一个User。

他也可以处理一个代号(token),像这样
class MyBackend:
 def authenticate(token=None):
 # 检测并返回User。
当 authenticate 接受的参数被验证为有效的时候,应该返回一个 User 对象;如果无效的时候,应该返回 None 。

Django的admin系统紧密地与 User 对象绑定在一起。目前,最好的处理方法就是为你每一个现存的后端(例如,你的LDAP目录或者你的外部SQL数据库等等。)数据创建一个Django的 User 对象。你可以预先写一个脚本来做这些事情,或者在用户第一次登录的时候在你的 authenticate 方法中做这些事情。

下面是一个例子,使用在 settings.py 文件里定义的用户名和密码并且在用户第一次登录的时候创建一个Django的 User 对象。

from django.conf import settings
from django.contrib.auth.models import User, check_password class SettingsBackend:
"""
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:
# 创建新用户。
# 我们可以设置任何新的密码,因为它不会被检测。
# 在这里我们使用”get from settings.py”。
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

最新文章

  1. pptpvpn 连接后 无法上外网
  2. HTML基本组成结构与标签的认识
  3. 关于安卓开发当中通过java自带的HttpURLConnection访问XML的java.io.EOFException问题
  4. Dynamic CRM 2013学习笔记(三十五)自定义审批流6 - 审批通过后,再审批 - 二次审批
  5. LightOj1056 - Olympics(简单数学题)
  6. java位运算符常见用法
  7. 面向过程部分 Java 和 C++ 的区别
  8. git简单使用和说明文件的书写
  9. ExcelUtils 导表实例
  10. Oracle用户进程跟踪
  11. xapian搜索系统存储结构解读
  12. [Hapi.js] Route parameters
  13. python的列表(二)
  14. 高仿二次元网易GACHA
  15. Screen命令安装使用教程
  16. django之Ajax续
  17. 【转】 C++析构函数的作用和用法
  18. FullCalendar:eventColor,eventBackgroundColor, eventBorderColor, and eventTextColor
  19. GC Root 对象有哪些
  20. sql server 字符串字节长度

热门文章

  1. C10 C语言数据结构
  2. python-下拉框
  3. Qt:实现子线程发送信号父线程切换图片
  4. python入门:1-99所有数的和附带等式
  5. mysql 的 case when 用法
  6. VNC远程登录端使用经验之一
  7. python有三元运算符吗
  8. python中字典的‘增、删、改、查’
  9. nrf51822微信开发入门学习笔记1:开始前的准备
  10. eclipse使用技巧的网站收集——转载(二)