zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    LinkedList的实现源码分析
    ArrayList实现源码分析
    探索HashMap实现原理及其在jdk8数据结构的改进
    Maven的安装使用以及 Maven+Spring hello world example
    RedisHelper帮助类
    Stream 和 byte[] 之间的转换
    WCF For Silverlight跨域策略
    Linq Query常见错误
    Linq to Sharepoint--如何获取Linq Query 生成的CALM
    如何使用代码备份SQL Server数据库
  • 原文地址:https://www.cnblogs.com/lddhbu/p/2564072.html
Copyright © 2011-2022 走看看