在Django中哈希密码后,我无法登录,因为我的密码没有被删除

时间:2015-06-27 05:56:40

标签: python django

我是Django的新手,所以我很感激能得到的任何帮助。我刚刚创建了一个可以更改用户名,电子邮件和密码的表单。目前,当我使用该表单保存新密码时,它会被散列并存储,这是所需的行为。但是,当我登录时,因为我使用了未加密的密码,authenticate()函数无法检索用户而我无法登录。

请注意,如果我使用哈希版本的密码登录,则可以使用。但是我不需要使用密码版本的密码来登录。那么有没有办法在不使用密码版本的情况下登录?

class UserProfileForm(UserChangeForm):
    password = forms.CharField(required=False, widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username','email','password',)

    def clean_password(self):
        return ""


def change_profile_settings(request):
    settings_changed = False

    if request.method == 'POST':
        user_form = UserProfileForm(request.POST, instance=request.user)

        if user_form.is_valid():

            # user.password is hashed

            user.set_password(user.password)
            user.save()
            settings_changed = True
        else:
            print user_form.errors

    else:
        user_form = UserProfileForm(instance=request.user)

    return render(request,
            '/profile.html',
            {'user_form': user_form, 'settings_changed': settings_changed} )


def user_login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']

        # password is not hashed and therefore fails authenticate
        # it cannot retrieve user so it goes to the else block

        user = authenticate(username=username,password=password)

        if user:
            if user.is_active:

                login(request,user)
                return HttpResponseRedirect('/')
            else:
                message="disable"
                return render(request,'/login.html',{"message":message})
        else:
            message="invalid"
            return render(request,'/login.html',{"message":message})
    else:
        message="work"
        return render(request,'/login.html',{"message":message})

2 个答案:

答案 0 :(得分:3)

我认为您的个人资料表格不匹配......

您的UserProfileForm clean_password返回''字符串。这不应该是这样的。

并且change_profile_settings方法user.set_password(user.password)参数应为表单密码字段,即user_form.cleaned_data['password']

答案 1 :(得分:1)

如果您想通过将纯文本密码与数据库中的散列密码进行比较来手动验证用户身份,请使用便捷功能check_password()。它需要两个参数:

  1. 要检查的纯文本密码,
  2. 要检查的数据库中用户密码字段的完整值
  3. 如果匹配则返回True,否则返回False。

    Source