使用明文密码创建的 Django 用户



我在我的 django 应用程序中遇到了问题,其中新创建的用户正在使用明文密码进行设置。

这是失败的测试。

def test_create_valid_user_success(self):
"""Test creating user with valid user is successful"""
payload = {
'email': 'test@email.com',
'password': 'testpass',
'name': 'Test Name'
}
res = self.client.post(CREATE_USER_URL, payload)
self.assertEqual(res.status_code, status.HTTP_201_CREATED)
user = get_user_model().objects.get(**res.data)
print(user.password) # Comes out as clear text == 'testpass'
self.assertTrue(user.check_password(payload['password']))
self.assertNotIn('password', res.data)

测试错误:

======================================================================
FAIL: test_create_valid_user_success (user.tests.test_user_api.PublicUserApiTests)
Test creating user with valid user is successful
----------------------------------------------------------------------
Traceback (most recent call last):
File "/app/user/tests/test_user_api.py", line 33, in test_create_valid_user_success
self.assertTrue(user.check_password(payload['password']))
AssertionError: False is not true

序列化程序:

from django.contrib.auth import get_user_model
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
"""Serializer for users object"""
class Meta:
model = get_user_model()
fields = ('email', 'password', 'name')
extra_kwargs = {
'password': {
'write_only': True,
'min_length': 8
}
}
def create(self, validated_data):
"""Create a new user with encrypted password and return it"""
return get_user_model().objects.create_user(**validated_data)

型:

class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
"""Creates and saves a new user"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(email=self.normalize_email(email), **extra_fields)
user.set_password(password)
user.save(using=self._db)

我在这里缺少什么,以便在创建时正确散列用户密码?

好吧,我不要觉得自己很傻。

当我在序列化程序中的Meta下创建create方法时,我忘记了缩进,所以我的createMeta的一部分而不是UserSerializer

正确的缩进:

class UserSerializer(serializers.ModelSerializer):
"""Serializer for users object"""
class Meta:
model = get_user_model()
fields = ('email', 'password', 'name')
extra_kwargs = {
'password': {
'write_only': True,
'min_length': 8
}
}
def create(self, validated_data):
"""Create a new user with encrypted password and return it"""
return get_user_model().objects.create_user(**validated_data)

最新更新