Как сохранить пароль в виде хэшированного пароля в базе данных 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')