Django的AUTHENTICATION_BACKENDS 是如何影响django.contrib.auth中的authenticate的?

当然可以!以下是一个整理好的简明说明,适合用来介绍 AUTHENTICATION_BACKENDS 是如何影响 django.contrib.auth.authenticate 的:



🔐 AUTHENTICATION_BACKENDSauthenticate() 的关系

1. authenticate() 是做什么的?

Django 的 authenticate() 函数用于对用户凭据进行验证,并返回一个已认证的用户对象:

from django.contrib.auth import authenticate

user = authenticate(username='admin', password='123456')

这个函数不会自己完成认证逻辑,而是委托给一个或多个“认证后端”



2. 什么是 AUTHENTICATION_BACKENDS

AUTHENTICATION_BACKENDS 是 Django 的一个设置项,用于指定可以用于认证的后端列表:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'myapp.auth_backends.MyCustomBackend',
]

这是一个列表,里面每一项都是一个后端类的路径,必须实现 authenticate() 方法。



3. authenticate() 如何使用这些后端?

当你调用:

authenticate(request=None, **credentials)

Django 会按顺序尝试 AUTHENTICATION_BACKENDS 中的每一个后端:

for backend in get_backends():
    user = backend.authenticate(request, **credentials)
    if user is not None:
        return user
  • 每个后端收到相同的 **credentials(比如 username, password, token 等);
  • 第一个返回非 None 的后端“获胜”,认证通过;
  • 如果所有后端都返回 None,认证失败。


4. 默认后端:ModelBackend

如果你不设置 AUTHENTICATION_BACKENDS,Django 默认使用:

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']

这个后端使用数据库中的用户名和密码字段进行验证。



5. 自定义后端支持其他凭据

例如,如果你想支持 token 登录,可以写一个自定义后端:

class TokenAuthBackend:
    def authenticate(self, request, token=None, **kwargs):
        if token == 'valid-token':
            return get_user_from_token(token)
        return None

然后注册到 settings.py

AUTHENTICATION_BACKENDS = [
    'myapp.auth_backends.TokenAuthBackend',
    'django.contrib.auth.backends.ModelBackend',
]

这样你就可以调用:

authenticate(token="valid-token")


✅ 总结

项目说明
authenticate()尝试调用所有后端的 authenticate() 方法
AUTHENTICATION_BACKENDS控制有哪些认证后端被使用
顺序后端按顺序尝试,谁先返回用户对象,谁就“获胜”
默认行为默认只使用 ModelBackend,基于用户名密码验证
扩展能力可以添加自定义后端,支持 token、手机号等多种登录方式


文章标签:

评论(0)