使用信号量实现注册时密码加密,但是,修改密码则是明文

来源:7-13 django信号量实现用户密码修改

两努

2020-02-27

使用信号量实现注册时密码加密,但是,修改密码则是明文

修改密码,
登陆后,通过 api = http://0.0.0.0:8000/users/1/
进行修改密码
修改密码后,密码是明文。如果把修改的密码设置成加密的?

写回答

3回答

bobby

2020-03-02

你可以看看这个 用户的密码设置比较特殊 需要调用 set_password方法才能做到 https://blog.csdn.net/weixin_44786530/article/details/95898986 但是这个文档中使用的是apiview,你可以:

  1. 将def perform_update(self, serializer):
            return serializer.save()
  2.  self.perform_update(serializer)   改成 user = self.perform_update(serializer)
  3. user.set_password(xxx) 这里的xxx需要从原始的request.data中去获取新密码
0
0

两努

提问者

2020-02-29

在 views.py 中

class UserViewset(mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
   """
   用户
   """
   serializer_class = UserRegSerializer
   queryset = User.objects.all()
   authentication_classes = (JSONWebTokenAuthentication, authentication.SessionAuthentication)

   # 用户注册
   def create(self, request, *args, **kwargs):
       serializer = self.get_serializer(data=request.data)
       serializer.is_valid(raise_exception=True)
       user = self.perform_create(serializer)

       re_dict = serializer.data
       payload = jwt_payload_handler(user)
       re_dict["token"] = jwt_encode_handler(payload)
       re_dict["name"] = user.name if user.name else user.username

       headers = self.get_success_headers(serializer.data)
       return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)

   def update(self, request, *args, **kwargs):
       partial = kwargs.pop('partial', False)
       instance = self.get_object()
       serializer = self.get_serializer(instance, data=request.data, partial=partial)
       serializer.is_valid(raise_exception=True)
       self.perform_update(serializer)

       if getattr(instance, '_prefetched_objects_cache', None):
           # If 'prefetch_related' has been applied to a queryset, we need to
           # forcibly invalidate the prefetch cache on the instance.
           instance._prefetched_objects_cache = {}

       return Response(serializer.data)

   def perform_update(self, serializer):
       serializer.save()

   def partial_update(self, request, *args, **kwargs):
       kwargs['partial'] = True
       return self.update(request, *args, **kwargs)

   # 用户信息获取,传入任何一个数,都会返回用户 id,怎么传?
   def get_object(self):
       return self.request.user

   def perform_create(self, serializer):
       return serializer.save()


通过登陆访问http://0.0.0.0:8000/users/1/

然后部分更新数据,把密码传过去。然后就以明文的方式直接覆盖密码了。

0
0

bobby

2020-02-29

修改密码你是怎么修改的?通过什么修改的?

0
0

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2906 学习 · 2491 问题

查看课程