【发布时间】:2020-10-15 08:32:58
【问题描述】:
我有一个 Django 站点,它使用电子邮件和密码对用户进行身份验证。目前,用户及其密码是在管理面板中创建的,然后用户可以使用此电子邮件和密码登录。这一切都很好。一旦我尝试更改密码,就会出现问题,因为当使用命令行工具更改用户密码、使用我的自定义视图或使用 Django 的内置视图时,我无法再以使用旧或旧的用户身份登录新密码。我认为这是加盐的错误,因为在管理面板中查看密码未更改的用户时,密码字段如下所示:Invalid password format or unknown hashing algorithm.,但在密码用户的密码字段中,我试图更改该字段看起来像这样:algorithm: pbkdf2_sha256 iterations: 150000 salt: *********** hash: *******************************************。
登录视图:
class LoginView(View):
template_name = "account/login_template.html"
def get(self, request):
next_url = request.GET.get('next') if 'next' in request.GET else 'profile'
if request.user.is_anonymous:
form = UserLoginForm()
return render(request, template_name=self.template_name, context={'form': form, "next": next_url})
return redirect(next_url)
def post(self, request):
form = UserLoginForm(request.POST)
user = authenticate(email=form.data['email'],
password=form.data['password'])
if user:
login(request, user)
next_url = request.POST.get('next') if 'next' in request.POST else 'profile'
return redirect(next_url)
messages.error(request=request, message="error")
return redirect('/')
这里是用户创建管理器:
def create_user(self, email, password):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=UserManager.normalize_email(email),
)
user.set_password(password)
user.save(using=self._db)
return user
用户登录表单:
class UserLoginForm(forms.ModelForm):
class Meta:
model = User
#: Fields used.
fields = ('email', 'password',)
email = forms.CharField(label='Email', widget=forms.TextInput(
attrs={
'class': 'form-control',
'id': 'email',
'type': 'text'
}
))
password = forms.CharField(label='Password', widget=forms.PasswordInput(
attrs={
'class': 'form-control',
'id': 'password',
}
))
【问题讨论】:
-
我发布了登录视图。你是说你想要认证功能?
-
啊,对不起。无视我之前的评论。您是否有用于更改用户密码的自定义视图?这个
Invalid password format...消息是只对新创建的用户显示还是在更改密码时也会出现? -
为新创建的用户显示。我从来没有通过我的自定义视图或通过 manage.py 命令成功地更改用户的密码。我有一个用于更改用户密码的自定义视图,但我使用了 django 的默认视图,产生了类似的结果
-
print(user.password)为密码无效的用户输出什么?这条消息似乎是由this code 设置的。 Django 无法识别散列算法,因此显示此消息。 -
它为密码无效的用户打印原始密码('password'),为密码有效的用户打印散列密码('pbkdf2_sha256$150000$zdbfMeN79Iyg$5rRgMfCQ8KGaLKm5Myl5uOdGZvf1VNwWKauBoE/WTk4=')。此原始密码可用于登录,但不能更改。我无法使用散列密码登录。可能是我的用户管理器没有正确散列密码的问题吗?
标签: python python-3.x django password-hash