Django的login机制
已于 2025年10月30日 20:48 修改
访问次数:0
Django 中 login() 的运作机制,从前端到后端。
1️⃣ 基本调用
在 Django 中,登录用户通常这样写:
from django.contrib.auth import authenticate, login
user = authenticate(request, username='alice', password='123456')
if user is not None:
login(request, user)
- authenticate():验证用户名和密码是否正确
- login():把这个用户标记为“已登录”
2️⃣ login() 的内部逻辑
login() 定义在 django.contrib.auth:
def login(request, user, backend=None):
...
步骤:
- 检查用户对象 确保 user.is_active 为 True,否则不允许登录。
- 选择认证后端 如果你调用 authenticate() 返回的用户对象已经有 _backend 属性,Django 会用它。 否则你必须显式传入 backend 参数。 默认情况下,Django 会使用 ModelBackend。
- 写入 Session Django 会在 request.session 中存储: request.session[SESSION_KEY] = user.pk request.session[BACKEND_SESSION_KEY] = backend_path request.session[HASH_SESSION_KEY] = user.get_session_auth_hash() SESSION_KEY → 用户 ID BACKEND_SESSION_KEY → 认证后端路径 HASH_SESSION_KEY → 用户密码哈希,用于检测用户密码是否被修改,如果修改了就强制登出
- 刷新 CSRF Token Django 默认会更新 CSRF token,防止会话固定攻击(session fixation)。
- 标记请求中的用户 之后 request.user 会变成这个 user 实例,request.user.is_authenticated 返回 True。
3️⃣ session 存储
- Django 默认把 session 存在数据库(django.contrib.sessions)中,也可以用缓存、文件、cookie 等。
- session key 存储在用户浏览器的 cookie 中: Cookie: sessionid=abc123...
- 通过这个 session,Django 在每个请求中都能知道用户是谁。
4️⃣ logout() 与 login() 的关系
- logout() 会删除 session 中的上述信息: SESSION_KEY, BACKEND_SESSION_KEY, HASH_SESSION_KEY
- 这样 request.user 会变成 AnonymousUser,is_authenticated 返回 False。
5️⃣ 小结表格
| 函数 | 作用 | 核心机制 |
|---|---|---|
authenticate() | 验证用户名/密码 | 调用 AUTHENTICATION_BACKENDS |
login() | 设置用户登录状态 | 写 session,更新 CSRF,标记 request.user |
request.user | 当前用户对象 | 从 session 读取 user id + backend,返回 User 或 AnonymousUser |
logout() | 清空登录状态 | 删除 session 中的用户信息 |
✅ 结论:
- login() 并不验证密码,它只是标记用户已登录。
- 密码验证必须用 authenticate() 或自定义逻辑完成。
- 登录状态通过 session 管理,所以浏览器关闭、session 过期都会自动失效。

评论(0)