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

Django AbstractUser自定义用户模型登录状态保持异常问题求助

Django自定义用户模型登录状态无法保持的解决方案

问题概述

基于AbstractUser自定义用户模型,注册、登录功能可正常创建或识别用户,但无法维持登录状态,访问需认证的视图时会提示匿名用户访问。该用户模型以shenase作为唯一标识,采用无密码登录逻辑。

核心问题分析

  • 自定义认证后端缺失/配置错误:默认ModelBackend依赖密码验证,而当前登录逻辑仅通过shenase识别用户,必须自定义适配的认证后端并全局配置。
  • 模型内冗余配置无效:在MyUser类中直接定义backend字段无法生效,认证后端需在settings.py中全局配置。
  • 登录流程未关联认证后端:login()方法需配合指定的认证后端,才能正确持久化登录会话。

具体修复步骤

1. 实现自定义认证后端

在account应用目录下创建mybackend.py,编写如下代码:

from django.contrib.auth.backends import ModelBackend
from .models import MyUser

class ModelBackend(ModelBackend):
    def authenticate(self, request, shenase=None, **kwargs):
        try:
            return MyUser.objects.get(shenase=shenase)
        except MyUser.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return MyUser.objects.get(pk=user_id)
        except MyUser.DoesNotExist:
            return None

2. 全局配置认证后端

在项目的settings.py中添加以下配置:

# 指定自定义用户模型
AUTH_USER_MODEL = 'account.MyUser'

# 配置自定义认证后端
AUTHENTICATION_BACKENDS = [
    'account.mybackend.ModelBackend',
]

3. 清理模型冗余配置

删除MyUser类中的backend = 'account.mybackend.ModelBackend'字段,该配置应统一放在settings.py中。

4. 修复登录视图逻辑

修改welcome视图,确保login()方法显式关联自定义认证后端:

from django.contrib.auth import login

def welcome(request):
    try:
        shenase = request.session.get('user_shenase')
        user = MyUser.objects.get(shenase=shenase)

        user.is_active = True
        user.save()
        # 显式指定认证后端完成登录
        login(request, user, backend='account.mybackend.ModelBackend')

        return render(request, 'account/welcome.html', {'shenase': shenase})

    except MyUser.DoesNotExist:
        messages.error(request, "发生错误,请重试。")
        return HttpResponseRedirect(reverse('account:register_view'))

5. 简化注册视图逻辑(可选)

注册视图可直接在创建/获取用户后完成登录,无需依赖会话中转:

def register_view(request):
    form = forms.RegisterForm

    if request.method == "POST":
        shenase = request.POST.get('shenase')
        try:
            user = MyUser.objects.get(shenase=shenase)
            user.is_active = True
            user.save()
            login(request, user, backend='account.mybackend.ModelBackend')
            return HttpResponseRedirect(reverse('account:welcome'))
        except MyUser.DoesNotExist:
            form = forms.RegisterForm(request.POST)
            if form.is_valid():
                user = form.save(commit=False)
                user.is_active = True
                user.save()
                login(request, user, backend='account.mybackend.ModelBackend')
                return HttpResponseRedirect(reverse('account:welcome'))
    return render(request, 'account/register.html', {'form': form})

验证方式

  1. 重启Django服务。
  2. 完成注册/登录后,访问需认证视图,检查request.user.is_authenticated是否返回True。
  3. 查看浏览器会话Cookie(默认名为sessionid),确认登录后Cookie已正确生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:35:25