我使用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"
非常感谢。
答案 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
子类的配置文件模型,但只有一个到一个与它有一种关系。