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

Django REST Session认证Postman调用后用户匿名问题排查

问题诊断与解决

1. 核心问题:自定义认证后端的get_user方法参数不符合Django规范

Django的认证后端要求get_user方法必须接收**用户主键(user_id)**作为参数,而你的代码里写的是get_user(self, phone)。

当你调用login(request, user)后,Django会把用户的ID存入session。后续请求到来时,Django会调用get_user方法,并传入session中保存的用户ID,而不是手机号。这时候你的代码用传入的ID去匹配phone字段,自然查不到用户,返回None,最终request.user就变成了AnonymousUser。

修复代码:

class MyBackend(ModelBackend):

    def authenticate(self, request, phone=None, otp=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(phone=phone)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.otp == otp:
                # 建议验证后清空OTP,避免重复使用
                user.otp = None
                user.save()
                return user

    def get_user(self, user_id):  # 修改参数为user_id
        UserModel = get_user_model()
        try:
            return UserModel.objects.get(pk=user_id)  # 用主键查询用户
        except UserModel.DoesNotExist:
            return None

2. 确认settings.py中配置了自定义认证后端

必须让Django识别你的自定义后端,在settings.py中添加:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'your_app_name.backends.MyBackend',  # 替换成MyBackend的实际路径
]

因为你使用了SessionAuthentication,认证成功后服务器会返回session cookie,后续的UserInfo请求必须带上这个cookie才能被识别为已登录用户:

  • 在Postman中开启「Automatically send cookies」(请求的Cookies标签页内设置)
  • 确保调用/validate-otp/后,后续GET请求自动携带返回的session cookie

4. 小细节修正

UserInfo的权限配置写法可以更规范:

permission_classes = [IsAuthenticated]  # 去掉多余括号,使用列表格式即可

内容的提问来源于stack exchange,提问作者Андрей

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:46:16