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

自定义Django User类后后台创建用户密码未哈希及登录问题求解

自定义User模型的密码哈希与Admin表单字段问题解决

问题描述

  • 继承AbstractUser实现自定义用户模型后,密码以明文存储在MySQL中,导致通过Admin面板创建的员工账号无法登录,同时基于DRF+Djoser搭建的认证API也无法使用这些账号登录。
  • 最初使用admin.ModelAdmin注册自定义User模型,后来按照建议改为继承django.contrib.auth.admin.UserAdmin,但添加用户的表单仅显示用户名、密码、确认密码3个字段,无法配置更多用户属性。

解决方案

1. 核心:用UserAdmin处理密码哈希

普通的ModelAdmin不会处理密码哈希逻辑,只有Django自带的UserAdmin(或继承它的自定义类)会在创建/修改用户时自动对密码进行哈希存储,这是解决明文密码问题的关键。

2. 自定义Admin表单字段

继承UserAdmin后,通过配置add_fieldsets(添加用户时的字段组)和fieldsets(编辑用户时的字段组),可以自定义Admin页面显示的字段,解决表单字段过少的问题。

修改后的admin.py代码:

from django.contrib.auth.admin import UserAdmin as DefaultUserAdmin
from .models import User

class UserAdmin(DefaultUserAdmin):
    # 配置添加用户时显示的字段组
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2', 'email', 'first_name', 'last_name', 'is_staff', 'is_active'),
        }),
    )
    # 配置编辑用户时显示的字段组
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        ('个人信息', {'fields': ('first_name', 'last_name', 'email')}),
        ('权限', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        ('重要日期', {'fields': ('last_login', 'date_joined')}),
    )

admin.site.register(User, UserAdmin)

3. 关键配置:指定默认用户模型

确保在项目的settings.py中添加以下配置,告诉Django使用你的自定义User模型:

AUTH_USER_MODEL = '你的应用名.User'

(将你的应用名替换为实际包含User模型的应用名称)

4. 数据库迁移(若未执行)

如果是首次配置自定义User模型,需要重新生成并执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

说明

  • 使用DefaultUserAdmin继承后,Admin会自动处理密码哈希,创建用户时输入的密码会被加密存储,解决登录失败的问题。
  • 通过add_fieldsets和fieldsets可以灵活控制Admin页面显示的字段,满足业务对用户属性的配置需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:10:56