自定义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
相关产品推荐
相关产品推荐

