django - 如何在 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
解决方案
我尝试使用您的方式存储密码,但密码没有以正确的形式存储。因此,您不能仅使用 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)
希望答案有用。
推荐阅读
- ios - (Swift)帮助我解决“DocumentReference”初始化错误问题
- css - 在 vs 代码中使用 sass 实时服务器进行编译时,scss 中出现未定义的变量错误
- postgresql - 在月表中将间隔转换为小时
- haskell - 将 where 表达式实现到 haskell 解释器
- ruby-on-rails - 是否可以刷新/使用其他人的 Google 日历?
- php - laravel 中的默认时间戳(create_at 和 updated_at)保存到 db 的格式是什么?
- visual-studio-code - 无法运行 VSCode 源代码,因为它无法在目录中找到电子应用程序
- c++ - 这段代码给了我运行时错误。如何修复此代码?
- ruby - Capybara 找不到下拉列表
- sql - SQL - 仅使用所有月份都存在的客户端