In [1]: from django.contrib.auth import authenticate In [2]: user=authenticate(username="bookstore",password="python_django") In [3]: user Out[3]: <User: bookstore> In [4]: user=authenticate(username="bookstore",password="python") In [5]: user is None Out[5]: True
def authenticate(request=None, **credentials):
#__get_backends获取当前系统中定义的认证后端,并依次迭代
for backend, backend_path in _get_backends(return_tuples=True):
try:
inspect.getcallargs(backend.authenticate, request, **credentials)
except TypeError:
#此后端不接受这些凭据作为参数。返回继续执行循环
continue
try:
#通过当前的认证后端尝试获取 User,若获取不到就会抛出异常!
user = backend.authenticate(request, **credentials)
except PermissionDenied:
#抛出异常Permission
break
#如果没有返回,继续执行下一个认证
if user is None:
continue
#添加一个属性标志,代表后端认证成功
user.backend = backend_path
return user
# 所提供的凭据对所有后端、触发信号无效
user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)
def _get_backends(return_tuples=False):
backends = []
#AUTHENTICATION_BACKENDS 定义了当前系统可以用的身份认证列表
for backend_path in settings.AUTHENTICATION_BACKENDS:
#加载后端
backend = load_backend(backend_path)
backends.append((backend, backend_path) if return_tuples else backend)
#如果未定义后端列表抛出异常
if not backends:
raise ImproperlyConfigured(
'No authentication backends have been defined. Does '
'AUTHENTICATION_BACKENDS contain anything?'
)
return backends
但是我们并没有对 AUTHENTICATION_BACKENDS 进行定义,所以这里会使用户 Django 框架默认的后端认认证,它位于 django/conf/global_settings.py 文件中,如下所示:
AUTHENTICATION_BACKENDS=['django.contib.auth.backends.ModelBackend'] #当前系统默认认证后端ModelBackend
def get_user_model():
"""
返回一个处于激活状态的 User
"""
try:
return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
except ValueError:
raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
except LookupError:
raise ImproperlyConfigured(
"AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
)
get_user_model 使用实例如下所示:
# 使用默认User model时 >>> from django.contrib.auth import get_user_model >>> get_user_model() <class 'django.contrib.auth.models.User'> # 使用自定义User model时 >>> from django.contrib.auth import get_user_model >>> get_user_model() <class 'xxx.models.NewUser'> # get_user_model()实际获取的是settings.AUTH_USER_MODEL指定的User modelDjango 允许在 settings.py 文件中定义 AUTH_USER_MODEL 覆盖默认的 auth.User,以满足特定项目的需求。所以,ModelBacakend 的 authenticate 方法首先会通过 username 尝试获取 User 对象,再去校验密码是否正确以及 is_active 的状态,最后返回 User 对象或是返回 None。在 settings.py 配置 AUTH_USER_MODEL 格式如下所示:
#格式: "<django_app名>.<model名>"
AUTH_USER_MODEL = "appname.NewUser"
#在models.py编写示例
from django.conf import settings
from django.db import models
class Article(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
title = models.CharField(max_length=100)
在 django/contrib/auth/__init__.py 文件中定义了用户的各种行为,例如,登录、退出、用户的认证等等,通过这些可见 Django 的强大所在,Auth 应用模块可以帮助开发者减少很多的工作量,而且 Auth 应用的源码可以给开发者提供诸多的用户系统重写思路。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有