首页 > 解决方案 > 如何在 django 中以 pbkdf2_sha256 格式存储用户密码?

问题描述

我正在实现自定义寄存器序列化程序。顺便说一句,密码在管理页面上是加密的,所以它与 pbkdf2_sha256 不同。像这样

!eWf3UsvTHU4dJ4F.....

我想使用 pbkdf2_sha256 的算法而不是这个来获取用户的密码。我应该怎么办?这是我的代码。

class customRegisterSerializer (serializers.Serializer) :
    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
    password = serializers.CharField(required=True, write_only=True)
    user_Name = serializers.CharField(required=True)
    profile = serializers.ImageField(use_url=True)

    def validate_email(self, email):
        email = get_adapter().clean_email(email)
        if allauth_settings.UNIQUE_EMAIL:
            if email and email_address_exists(email):
                raise serializers.ValidationError(
                    _("A user is already registered with this e-mail address."))
        return email

    def validate_password (self, password: str) -> str:
        return get_adapter().clean_password(password)

    def get_cleaned_data(self):
        return {
            'email': self.validated_data.get('email', ''),
            'password': self.validated_data.get('password', ''),
            'userName': self.validated_data.get('userName', ''),
            'profile' : self.validated_data.get('profile', ''),
        }

    def save(self, request):
        adapter = get_adapter()
        user = adapter.new_user(request)
        self.cleaned_data = self.get_cleaned_data()
        adapter.save_user(request, user, self)
        setup_user_email(request, user, [])
        return user

标签: djangodjango-serializer

解决方案


我尝试使用您的方式存储密码,但密码没有以正确的形式存储。因此,您不能仅使用 User 模型来存储密码。你需要另一个模型。创建一个配置文件模型并为其创建一个序列化程序,然后尝试以下操作:-

序列化程序.py

class UserRegistrationSerializer(serializers.ModelSerializer):

    profile = ProfileSerializer(required=False)

    class Meta:
        model = User
        fields = ('phone', 'username', 'password', 'profile')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        user = User.objects.create_user(**validated_data)
        users = Profile.objects.create(
            user=user,      
            state=profile_data['state'],
            city=profile_data['city'],
            date_Of_Birth=profile_data['date_Of_Birth'],
            address=profile_data['address']
             )
        users.save()
        
        return users

视图.py

class UserRegistrationView(CreateAPIView):

    serializer_class = UserRegistrationSerializer
    permission_classes = (IsAuthenticated,)

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        response = {
            'success' : 'True',
            'status code' : status.HTTP_200_OK,
            'message': 'User registered  successfully',
            }
        status_code = status.HTTP_200_OK
        return Response(response, status=status_code)

希望答案有用。


推荐阅读