Django哈希密码

时间:2018-04-22 00:06:46

标签: django

我使用django.contrib.auth

我的问题:登录无法正常工作,因为密码以明文形式保存,当我进入管理员或shell时,我可以用明文看到密码。如果我在shell中手动使用User.set_password(),那么我可以登录。

那么,为什么密码以明文保存而不是自动散列?

创建用户时有没有办法对其进行哈希?

我扩展默认用户以添加属性。

from django.db import models
from django.contrib.auth.models import User


class Profil(User):
    user = models.OneToOneField(User, on_delete=models.CASCADE, parent_link=True)
    postal_code = models.CharField(max_length=255)
    facebook_profil = models.URLField(max_length=255)
    make = models.CharField(max_length=255)
    model = models.CharField(max_length=255)
    year = models.CharField(max_length=255)
    photo = models.ImageField(upload_to="")

    def __str__(self):
        return self.user.username

然后我有一个注册表和一个登录表单:

from django import forms
from members.models import Profil


class RegisterForm(forms.ModelForm):
    class Meta:
        model = Profil
        exclude = ("is_staff", "groups", "is_active", "is_superuser", 
                   "user_permissions", "last_login", "date_joined")
        fields = ["username", "password", "first_name", "last_name", "email", 
                 "postal_code", "facebook_profil", "make", "model", "year", "photo"]

class LoginForm(forms.Form):
    username = forms.CharField(label="Nom d'utilisateur", max_length=30)
    password = forms.CharField(label="Mot de passe", widget=forms.PasswordInput)

最后我有一个CreateView和一个LoginView来注册和登录用户:

from django.shortcuts import render
from django.views.generic import CreateView
from .models import Profil
from .forms import RegisterForm, LoginForm
from django.urls import reverse_lazy
from django.contrib.auth.views import LoginView

class Register(CreateView):
    template_name = "members/register.html"
    model = Profil
    form_class = RegisterForm
    success_url = reverse_lazy('login')

class Login(LoginView):
    form = LoginForm
    template_name = "members/login.html"

非常感谢。

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您的RegisterForm正在以明文形式将密码保存到password字段。在保存表单之前,您需要使用set_password()正确设置密码:

def save(self, commit=True):
    user = super().save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    if commit:
        user.save()
    return user

这取自Django' UserCreationForm

那,你设置Profil模型的方式非常奇怪,可能容忍其他问题。在该模型中继承User是没有意义的。你需要扩展AbstractUser,然后指示Django使用这个own custom user model,或者指定一个不是User子类的配置文件模型,但只有一个到一个与它有一种关系。