Python UserManager中的Django set_password()方法正在保存纯文本
我正在尝试为注册创建一个端点。 当我创建一个新用户时,密码字段中将保存一个纯文本。但是,当我通过admin添加用户时,它会被散列。我不确定我错过了什么 model.pyPython UserManager中的Django set_password()方法正在保存纯文本,python,django,django-rest-framework,django-views,django-serializer,Python,Django,Django Rest Framework,Django Views,Django Serializer,我正在尝试为注册创建一个端点。 当我创建一个新用户时,密码字段中将保存一个纯文本。但是,当我通过admin添加用户时,它会被散列。我不确定我错过了什么 model.py class UserManager(BaseUserManager): def _create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('The given email must be
class UserManager(BaseUserManager):
def _create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The given email must be set')
user = self.model(
email=self.normalize_email(email),
**extra_fields,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_admin', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
序列化程序.py
from rest_framework import serializers
from django.contrib.auth import authenticate
from .models import User
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User.objects.create_user(
validated_data['email'],
validated_data['password']
)
return user
view.py
class RegisterAPI(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
})
问题出现在注册表序列化程序中。创建方法:
def create(self, data):
user = User.objects.create(**data)
return user
您将用户的密码作为文本,并调用user.objects.create
来创建user
实例。UserManager
的create
方法(最终委托给QuerySet
)是通用的,这意味着password
字段将按原样填充为输入数据,而不进行任何散列
由于它是以明文形式保存的,Django无法确定它保存的格式(典型的格式是hash\u algo$iterations$salt$hash
),因此它无法从中找到散列算法salt,hash;因此,该错误导致密码格式无效或哈希算法未知
UserManager
公开了方法create\u user
为了通过传递纯文本密码并在那里执行所有这些操作来创建用户,您应该利用:
def create(self, data):
user = User.objects.create_user(**data)
# ^^^^ Here
return user
或者您可以直接在序列化程序中的用户实例上使用set\u password
,但正如您可以轻松使用create\u user
一样,您应该使用它。我将其更改为create\u user(),但它仍然给我相同的错误:(@user8229795通过API创建一个新用户并使用该用户登录。并从数据库更新所有现有用户以设置正确的密码(使用set\u password
)。我删除了数据库和迁移,但仍然不起作用。感谢您抽出时间。@user8229795请编辑您的问题并添加您现在得到的完整回溯。我编辑了我的问题。创建数据库时没有错误,但检查数据库时,它没有哈希。