Как сохранить пароль в виде хэшированного пароля в базе данных postgressql

Я создал в Django пользовательскую модель Employee, которая расширяет AbstractBaseUser. В модели Employee есть поле пароля типа CharField. В качестве базы данных я использую PostgreSQL.

При создании нового экземпляра Employee с помощью метода EmployeeManager.create_employee и указании пароля в виде простого текста пароль не сохраняется в базе данных PostgreSQL в виде хешированного значения. Вместо этого он сохраняется в виде простого текста.

Вот соответствующий код:

model.py

viwes.py

from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate
from .serializers import OrganizationSerializer, EmployeeSerializer
from .models import Employee, Organization


class OrganizationRegisterView(generics.CreateAPIView):
    queryset = Organization.objects.all()
    serializer_class = OrganizationSerializer


class EmployeeRegisterView(generics.CreateAPIView):
    queryset = Employee.objects.filter(is_employee=True)
    serializer_class = EmployeeSerializer


class LoginView(generics.GenericAPIView):

    def post(self, request):
        email = request.data.get('email')
        password = request.data.get('password')
        user = authenticate(request, email=email, password=password)

        if user is not None:
            token, _ = Token.objects.get_or_create(user=user)
            if user.is_employee:
                user_data = {
                    'id': user.id,
                    'email': user.email,
                    'name': user.name,
                    'token': token.key,
                    'organization': user.organization.name
                }
            else:
                user_data = {
                    'id': user.id,
                    'email': user.email,
                    'name': user.name,
                    'token': token.key
                }
            return Response(user_data, status=status.HTTP_200_OK)
        else:
            return Response({'error': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED)

serializers.py

from rest_framework import serializers
from .models import Employee, Organization
from django.contrib.auth.password_validation import validate_password
from django.core.exceptions import ValidationError


class OrganizationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Organization
        fields = ('id', 'email', 'name')


class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = ('id', 'email', 'name', 'password', 'organization')
        extra_kwargs = {'password': {'write_only': True}}

    def validate_password(self, value):
        try:
            validate_password(value)
        except ValidationError as e:
            raise serializers.ValidationError(e.messages)
        return value

settings.py

Как вы можете видеть, я пробовал разные типы PASSWORD_HASHERS, но я думаю, что я сделал неправильную кодировку, так как я только начинаю работать с Django.

Взятые шаги:

  • Я пробовал использовать методы make_password и set_password для хэширования пароля перед сохранением. (Просмотрел различные решения на stackoverflow, но они не помогли)
  • .
  • последовало следующее Unable to store hashed password in database in django still not helpful
  • Я изменил поле пароля на TextField на случай, если длина была проблемой с PostgreSQL.
  • Я запустил необходимые миграции Django после внесения изменений в модель.

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

Я полагаю, что вы использовали обычный Employee.objects.create(...) для создания экземпляра Employee. Вы можете попробовать использовать create_employee для создания Employee экземпляра:

Employee.objects.create_employee(email='employee1@company.com', name='Employee 1', organization='X', password='plain-text')
Вернуться на верх