【问题标题】:Django - how to save my hashed passwordDjango - 如何保存我的哈希密码
【发布时间】:2016-05-18 19:11:57
【问题描述】:

我正在尝试将我的哈希密码保存在我的数据库中,但它一直在保存我的明文密码

型号:

class StudentRegistration(models.Model):
    email = models.EmailField(max_length=50)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    password = models.CharField(max_length=100, default="", null=False)
    prom_code = models.CharField(max_length=8, default="", null=False)
    gender = (
    ("M","Male"),
    ("F","Female"),
    )
    gender = models.CharField(max_length=1, choices=gender, default="M",    null=False)
    prom_name = models.CharField(max_length=20, default="N/A")
    prom_year = models.IntegerField(max_length=4, default=1900)
    school = models.CharField(max_length=50, default="N/A")



    def save(self):
         try:
            Myobj = Space.objects.get(prom_code = self.prom_code)
            self.prom_name = Myobj.prom_name
            self.prom_year = Myobj.prom_year
            self.school = Myobj.school_name

            super(StudentRegistration, self).save()

        except Space.DoesNotExist:
            print("Error")

观看次数:

def register_user(request):
    args = {}
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)     # create form object
        if form.is_valid():
            clearPassNoHash = form.cleaned_data['password']
            form.password = make_password(clearPassNoHash, None, 'md5')
            form.save()
            form = MyRegistrationForm()
            print ('se salvo')
        else:
            print ('Error en el form')
    else:
        form = MyRegistrationForm()


    args['form'] = form #MyRegistrationForm()

    return render(request, 'register/register.html', args)

我已经打印了散列结果,所以我知道它是散列但没有保存。

我是否使用了 make_password 错误?或者有什么更好的方法来保护我的密码?

--------------更新:(解决方案)-------- --------------------

记住在settings.py中:

#The Hasher you are using
PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.MD5PasswordHasher',
)

模型.py:

#Import and add the AbstractBaseUser in your model

class StudentRegistration(AbstractBaseUser, models.Model):

Views.py:

if form.is_valid():
    user = form.save(commit=False)
    clearPassNoHash = form.cleaned_data['password']
    varhash = make_password(clearPassNoHash, None, 'md5')
    user.set_password(varhash)
    user.save()

【问题讨论】:

标签: python django hash django-views password-protection


【解决方案1】:

在文档中使用 Django set_password

https://docs.djangoproject.com/en/1.9/ref/contrib/auth/

您还需要使用 form.save(commit=False) 从表单中获取模型对象

if form.is_valid():
    # get model object data from form here
    user = form.save(commit=False)

    # Cleaned(normalized) data
    username = form.cleaned_data['username']
    password = form.cleaned_data['password']

    #  Use set_password here
    user.set_password(password)
    user.save()

【讨论】:

  • 要使用set_password(),我不需要改变我所有的模型吗?使用 AbstractBaseUser(自定义 Auth 模型)来使用这个方法?
  • 不,你不应该改变你的模型。
  • 它抛出了这个错误:'MyRegistrationForm' 对象没有属性'set_password'
  • 您是否使用 user = form.save(commit=False) 从表单中获取模型对象数据。完成后,您可以调用 user.set_password(password)
  • 非常感谢,我已经保存了我的Hashed密码,我只需要更改声明顺序:StudentRegistration(AbstractBaseUser, models.Model):
【解决方案2】:

先保存对象,不提交到数据库,然后在最终保存之前更新密码。确保你的导入都是正确的。

def register_user(request):
        if request.method == 'POST':
            form = MyRegistrationForm(request.POST)     # create form object
            if form.is_valid():
                new_object = form.save(commit=False)
                new_object.password = make_password(form.cleaned_data['password'])
                new_object.save()
                messages.success(request, "Form saved.")
                return redirect("somewhere")
            else:
                messages.error(request, "There was a problem with the form.")
        else:
            form = MyRegistrationForm()

        return render(request, 'register/register.html', { 'form': form })

【讨论】:

  • 一直保存明文密码,但是在我的cmd里可以看到结果
  • 我上面的回答是正确的。不要设置form.password,设置form.cleaned_data["password"]
  • 再次,它一直在保存明文密码,也许我们遗漏了什么
  • 我已经修改了你上面的代码,并验证了它,它确实有效。如果仍然有问题,可能是因为您的导入。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2020-11-18
  • 2015-10-07
  • 1970-01-01
  • 2015-08-18
  • 2016-06-15
  • 2012-06-12
相关资源
最近更新 更多