You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 5.0自定义认证后端下request.user返回AnonymousUser求助

问题排查方案

针对你遇到的Django 5.0中自定义认证后端登录后request.user始终为AnonymousUser、get_user方法未被调用的问题,按以下步骤排查:

1. 检查中间件顺序

MIDDLEWARE中必须保证SessionMiddleware在AuthenticationMiddleware之前,否则认证中间件无法读取session中的用户ID,也就不会触发get_user方法。正确配置示例:

MIDDLEWARE = [
    # 其他中间件...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 其他中间件...
]

2. 确认认证后端注册路径

检查settings.py中AUTHENTICATION_BACKENDS的配置,确保自定义后端的完整Python路径正确,例如:

AUTHENTICATION_BACKENDS = [
    'yourapp.backends.EmailBackend',  # 替换为你的后端实际路径
    # 若需保留用户名登录,可保留默认后端
    # 'django.contrib.auth.backends.ModelBackend',
]

3. 验证自定义用户模型配置

确保settings.py中已正确指定自定义用户模型:

AUTH_USER_MODEL = 'yourapp.User'  # 替换为你的用户模型实际路径

若未设置此项,Django会使用默认用户模型,可能导致session中的用户ID与自定义模型不匹配。

4. 检查用户状态

确认登录的用户is_active字段为True,若该字段为False,即使登录成功,Django也会在后续请求中返回AnonymousUser(注:登录时若用户is_active=False会抛出PermissionDenied,但需排除注册时未正确设置的情况)。

5. 排查主键类型匹配问题

若自定义用户模型使用非整数主键(如UUID),需确保get_user方法中对user_id的类型转换正确:

from uuid import UUID

class EmailBackend(ModelBackend):
    # ...其他方法
    def get_user(self, user_id):
        try:
            return User.objects.get(pk=UUID(user_id))
        except (User.DoesNotExist, ValueError):
            return None

6. 验证Session引擎配置

确保SESSION_ENGINE使用默认或正确配置的引擎,例如:

SESSION_ENGINE = 'django.contrib.sessions.backends.db'

若使用缓存型session引擎,需确认缓存服务正常运行且配置正确。


内容的提问来源于stack exchange,提问作者Killian F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:44:55