Django allauth自定义视图未哈希存储密码问题求助
嘿,我来帮你搞定这个密码明文存储的问题!
问题出在你的自定义RegisterForm上——你用了ModelForm直接保存密码,而Django不会自动对password字段做哈希处理,除非你调用用户模型的set_password()方法。下面给你两种解决方案,选适合你的就行:
方案一:重写ModelForm的save方法(适合坚持用ModelForm的情况)
修改你的forms.py,在save方法里手动调用set_password来哈希密码:
from .models import User from django import forms class RegisterForm(forms.ModelForm): class Meta: model = User fields = ['username', 'email', 'password'] username = forms.CharField(label='Username', widget=forms.TextInput(attrs={'placeholder': 'Username:'})) email = forms.EmailField(label='Email', widget=forms.EmailInput(attrs={'placeholder': 'Email:'})) password = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'placeholder': 'Password:'})) def save(self, commit=True): # 先创建用户实例但不立即保存到数据库 user = super().save(commit=False) # 用set_password处理密码哈希,这一步是关键! user.set_password(self.cleaned_data["password"]) if commit: user.save() return user
原理很简单:Django的用户模型(不管是默认的还是你自定义的,只要继承了AbstractBaseUser或AbstractUser)都自带set_password()方法,它会自动把明文密码转换成哈希值存储,而不是直接存明文。
方案二:继承allauth的SignupForm(更推荐,适配allauth生态)
既然你在用allauth的SignupView,不如直接继承allauth自带的SignupForm,它已经帮你处理了密码哈希、验证等细节,更省心:
from allauth.account.forms import SignupForm from django import forms from .models import User class RegisterForm(SignupForm): # 保留你需要的自定义字段和widget username = forms.CharField(label='Username', widget=forms.TextInput(attrs={'placeholder': 'Username:'})) email = forms.EmailField(label='Email', widget=forms.EmailInput(attrs={'placeholder': 'Email:'})) def save(self, request): # 调用父类的save方法,allauth会自动处理密码哈希 user = super().save(request) # 如果需要给用户模型设置其他字段,在这里补充 user.email = self.cleaned_data['email'] user.save() return user
这种方式的好处是,你不用自己操心密码哈希的逻辑,还能利用allauth自带的其他注册验证规则(比如密码强度检查之类的)。
最后提醒下:确保你的自定义User模型继承了AbstractBaseUser或者AbstractUser,这两个基类是Django处理用户认证和密码的基础,没有它们的话set_password方法也没法用哦。
内容的提问来源于stack exchange,提问作者user2896120
相关产品推荐
相关产品推荐

