Django用户模型缺失双重认证及密码未哈希存储问题
解决Django用户注册的双重密码校验与密码哈希问题
1. 密码明文存储的修复
Django的AbstractUser默认自带密码哈希逻辑,出现明文存储大概率是直接赋值password字段而非使用set_password()方法,或者表单未正确处理密码流程。
正确的用户创建方式
无论通过代码手动创建还是表单提交,必须用set_password()处理明文密码:
# 错误:直接赋值导致明文存储 user = AppBaseUser(username='customer001', password='123456') user.save() # 正确:自动生成哈希值 user = AppBaseUser(username='customer001') user.set_password('123456') user.save()
表单层面的哈希处理
如果用自定义注册表单,优先继承UserCreationForm(自带密码哈希逻辑),或在表单的save()方法中手动调用set_password():
from django.contrib.auth.forms import UserCreationForm from .models import AppBaseUser class BaseRegistrationForm(UserCreationForm): class Meta: model = AppBaseUser fields = ['username', 'email']
2. 双重密码校验的实现
Django默认的UserCreationForm已经包含password1和password2字段及校验逻辑,如果是完全自定义的表单,需手动添加字段并做一致性校验:
自定义带双重校验的注册表单
from django import forms from .models import AppBaseUser class CustomerRegistrationForm(forms.ModelForm): password1 = forms.CharField(label='密码', widget=forms.PasswordInput) password2 = forms.CharField(label='确认密码', widget=forms.PasswordInput) class Meta: model = AppBaseUser fields = ['username', 'email'] def clean_password2(self): # 校验两次密码是否一致 password1 = self.cleaned_data.get('password1') password2 = self.cleaned_data.get('password2') if password1 and password2 and password1 != password2: raise forms.ValidationError('两次输入的密码不匹配') return password2 def save(self, commit=True): # 保存时自动哈希密码 user = super().save(commit=False) user.set_password(self.cleaned_data['password1']) if commit: user.save() # 创建对应的客户角色实例 AppCustomerUser.objects.create(user=user) return user
3. 关键配置检查
确保settings.py中已正确绑定自定义用户模型:
AUTH_USER_MODEL = 'your_app_name.AppBaseUser'
内容的提问来源于stack exchange,提问作者ReniBo
相关产品推荐
相关产品推荐

