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的实际路径 ]
3. Postman请求需携带Session Cookie
因为你使用了SessionAuthentication,认证成功后服务器会返回session cookie,后续的UserInfo请求必须带上这个cookie才能被识别为已登录用户:
- 在Postman中开启「Automatically send cookies」(请求的Cookies标签页内设置)
- 确保调用
/validate-otp/后,后续GET请求自动携带返回的session cookie
4. 小细节修正
UserInfo的权限配置写法可以更规范:
permission_classes = [IsAuthenticated] # 去掉多余括号,使用列表格式即可
内容的提问来源于stack exchange,提问作者Андрей
相关产品推荐
相关产品推荐

