• AUTHENTICATION_BACKENDS


    [编辑]指定认证后端
    在暗中,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

     
  • 相关阅读:
    Hql语句注意事项总结
    数据库主键设计之思考
    UTF8的中文问题
    DirectShow SDK笔记【关于DirectShow(4)】
    关于kindeditor上传图片出现"服务器发生故障"的解决办法
    php 分隔字符串为数组
    yum 一次性安装 apache mysql php
    linux下安装gd库
    三种实现PHP伪静态页面的方法
    (转)Linux利器 strace
  • 原文地址:https://www.cnblogs.com/lddhbu/p/2564072.html
Copyright © 2020-2023  润新知