Django 用户身份验证

我们将使用 django.contrib.auth 包中
的 auth 应用。根据 Django 文档,这个应用提供了下述概念和功能:
? 用户和用户模型
? 权限,判断用户可以做什么及不可以做什么的旗标(是/否)
? 用户组,把相关权限一次赋予多个用户
? 可配置的密码哈希系统,保证数据安全不可或缺
? 登录或限制性内容所需的表单和视图
在使用 Django 提供的身份验证机制之前,要在项目的 settings.py 文件中添加相关的设置。
在 settings.py 文件中找到 INSTALLED_APPS 列表,检查有没有列出 django.contrib.auth 和
django.contrib.contenttypes 。 INSTALLED_APPS 列表应该类似下面这样:

INSTALLED_APPS =[ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rango',#app名字自己创建 ]

django.contrib.auth 用于访问 Django 提供的身份验证系统,而 django.contrib.contenttypes 供
auth 应用跟踪数据库中的模型。
★ 如有必要,迁移 ★
如果 INSTALLED_APPS 列表中没有 django.contrib.auth 和 django.contrib.contenttypes ,要
自己添加,添加后还要执行 python manage.py migrate 命令更新数据库,添加所需的表,例
如 User 模型的表。
在 Django 项目中添加新的应用后,一般最好执行 migrate 命令,以防应用中有模型要与底
层数据库同步

密码哈希
任何情况下都不能在数据库中存储明文密码。 1 如果包含用户账户的数据库落到不怀好意的人手
上,可能造成天大的灾难。幸好,Django 的 auth 应用默认存储的是经过 PBKDF2 算法计算过的
密码哈希值,可以有效保护用户数据的安全。然而,如果你想进一步控制生成密码哈希值的方
式,可以在项目的 settings.py 模块中更换 Django 使用的算法。为此,添加 PASSWORD_HASHERS 元
组,例如:
PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', )

罗列哈希算法的顺序很重要,Django 将使用 PASSWORD_HASHERS 中的第一个哈希算法
( settings.PASSWORD_HASHERS[0] )。如果第一个无效,而且还有其他哈希算法供选择,Django
将依次尝试后面的算法。

如果想使用更为安全的哈希算法,可以安装 Bcrypt( pip install bcrypt ),然后把
PASSWORD_HASHERS 设为:

PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', ]

前面说过,Django 默认使用 PBKDF2 算法计算密码哈希值。如果未在 settings.py 文件中设定
PASSWORD_HASHERS ,Django 将使用默认的 PBKDF2PasswordHasher 。详情参见 Django 文档。

密码验证器
鉴于人们经常使用相对容易猜出的密码,Django 1.9 引入了一个备受期待的新功能——密码验
证。在 Django 项目的 settings.py 模块中有个字典构成的列表,名为 AUTH_PASSWORD_VALIDATORS 。
在嵌套的字典中可以清楚地看出,Django 1.9 自带了一些常用的密码验证器,例如针对长度的验
证器。每个验证器都有 OPTIONS 字典,以便自定义选项。假如你想确保密码最短为 6 个字符,那
么可以把 MinimumLengthValidator 的 min_length 选项设为 6 ,如下所示:
AUTH_PASSWORD_VALIDATORS = [ ... { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': { 'min_length': 6, } }, ... ]



【Django 用户身份验证】

    推荐阅读