Django的AUTHENTICATION_BACKENDS 是如何影响django.contrib.auth中的authenticate的?
已于 2025年07月02日 17:12 修改
访问次数:0
当然可以!以下是一个整理好的简明说明,适合用来介绍 AUTHENTICATION_BACKENDS 是如何影响 django.contrib.auth.authenticate 的:
🔐 AUTHENTICATION_BACKENDS 与 authenticate() 的关系
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)