【问题标题】:Django changing password issuesDjango更改密码问题
【发布时间】: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


【解决方案1】:

实际上 Django 使用哈希算法将用户密码存储为哈希值, 因此,即使是应用程序创建者也看不到用户密码,这是 Django 开箱即用的一种安全机制。

作为开发人员,我们应该能够检查用户密码是否正确。

因为 Django 为用户对象实现了一些接口,例如 check_password()、set_password(),让我们的生活更轻松......

user_obj.check_password("password") -> 获取一个字符串并使用用户哈希密码验证它,如果它匹配此函数返回 true

for more queries see this reference, this will help you out

【讨论】:

  • 我知道这一点,我想弄清楚为什么有时密码似乎有哈希值,而有时却没有
猜你喜欢
  • 1970-01-01
  • 2021-02-09
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多