Django的login机制

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):
    ...

步骤:

  1. 检查用户对象 确保 user.is_active 为 True,否则不允许登录。
  2. 选择认证后端 如果你调用 authenticate() 返回的用户对象已经有 _backend 属性,Django 会用它。 否则你必须显式传入 backend 参数。 默认情况下,Django 会使用 ModelBackend。
  3. 写入 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 → 用户密码哈希,用于检测用户密码是否被修改,如果修改了就强制登出
  4. 刷新 CSRF Token Django 默认会更新 CSRF token,防止会话固定攻击(session fixation)。
  5. 标记请求中的用户 之后 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 过期都会自动失效。

ChatGPT Image 2025年10月30日 20_48_39.png

文章标签:

评论(0)