Кодирует ли django пароли в Базе Данных?

Я создал пользователя с паролем password123, но в базе данных поле пароля выглядит так pbkdf2_sha256$260000$rJZWVrYXlokRG8fGMS1fek$S7Dm9soflUsy0Q74CJP8sB60tgfRWuRPdqj5XL0DBV0=

  • проблема: когда я создаю нового пользователя через rest framework, я получаю poassword feidl, который выглядит как passsword123
  • .
  1. so how should i created new user in order to keep the django password encoding functionality
  2. also how to deactivate this password encoding functionality

ответ на вопрос 2.

Django не хранит пароль, только хэшированное значение пароля, которое он использует для сравнения, когда пользователь входит в систему.

Из этого хэша невозможно извлечь пароль (математически это возможно, но у вас нет ресурсов, чтобы запустить этот процесс). Да и не должно быть.

Если бы вам нужно было поле пароля без хэширования, вы бы использовали просто строковое поле. Но... НЕ ДЕЛАЙТЕ ЭТОГО! Это крайне небезопасно.

Вам нет необходимости знать пароль пользователя.

Что касается вопроса 1, я не уверен, почему вы не видите хэширование - вам нужно опубликовать код.

вам нужно переопределить create метод в User Create Serializer:

class UserCreateSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

    class Meta:
        model = User 
        fields = "__all__" # or your specific fields  
        extra_kwargs = {
            "password": {"write_only": True},
        }

Теперь ваш пароль пользователя будет сохранен как хэшированный пароль в базе данных.

Django использует посредников шифрования для шифрования паролей (поскольку база данных воспринимает пароли как поля VarChar, то модель Django воспринимает их как обычный текст, если ей не сказано обратное). Если вы хотите, чтобы модель Django User использовала шифрование, вы должны вызвать

user_obj.set_password(passwd_text) 

В этой строке кода вы указываете Django запустить алгоритмы шифрования. Например, в вашем случае вы можете сначала использовать extra_kwargs сериализатора, чтобы исключить пароли из данных, читаемых в базе данных, а затем создать пользователя.

class CreateUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'username', 'password']
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        password = validated_data.pop("password")
        user = User(**validated_data)
        user.set_password(password)
        user.save()
        return user 

если вы хотите прочитать больше о пользователях и паролях Django, прочитайте эти документы модель пользователя doc и типы шифрования и управление паролями doc

Вернуться на верх