首页 > 其他分享 >DRF当中序列化器中通过重写create()来实现保护登录保护

DRF当中序列化器中通过重写create()来实现保护登录保护

时间:2022-08-25 14:58:55浏览次数:81  
标签:序列化 get mobile True create re 器中 password data

在DRF原来源码框架中,我们知道保存的用户信息时,用户的密码是被明文保存到数据库中。

代码实class UserRegisterModelSerializer(serializers.ModelSerializer)    """

    用户注册的序列化器
    """
    re_password = serializers.CharField(required=True, write_only=True, help_text="确认密码")
   
    class Meta:
        model = User
        fields = ["mobile", "password", "re_password", ]
        extra_kwargs = {
            "mobile": {
                "required": True, "write_only": True
            },
            "password": {
                "required": True, "write_only": True, "min_length": 6, "max_length": 16,
            },
        }
            # 全局钩子函数
        def validate(self, data):
            """验证客户端数据"""
            # 手机号格式验证
            mobile = data.get("mobile", None)
            if not re.match("^1[3-9]\d{9}$", mobile):
                raise serializers.ValidationError(detail="手机号格式不正确!", code="mobile")

            # 密码和确认密码
            password = data.get("password")
            re_password = data.get("re_password")
            if password != re_password:
                # ValidationError(detail="",code="")  两个参数是根据源码
                raise serializers.ValidationError(detail="密码和确认密码不一致!", code="password")

            # 手机号是否已注册
            try:
                User.objects.get(mobile=mobile)
                raise serializers.ValidationError(detail="手机号已注册!")
            except User.DoesNotExist:
                pass
returndef create(self, validated_data):
        """保存用户信息,完成注册"""
        mobile = validated_data.get("mobile")
        password = validated_data.get("password")

        user = User.objects.create_user(
            username=mobile,
            mobile=mobile,
            avatar=constants.DEFAULT_USER_AVATAR,
            password=password,
        )

return user
通过重写序列化器中的create(),使用create_user()方法来创建,密码会自动进行加密后存放到数据库。就轻松搞定。

标签:序列化,get,mobile,True,create,re,器中,password,data
From: https://www.cnblogs.com/shaoyishi/p/16624237.html

相关文章

  • 序列化和反序列化
    序列化:把对象变成字符串。一般对象和json格式一样。反序列化:把json字符串转化为对象类型。 参考资料:C#JsonConvert.DeserializeObject反序列化与JsonConvert.Serial......
  • centos8 安装 oracle11 报错(Could not create the Java virtual machine)
    centos8安装oracle11报错TherewasanerrortryingtoinitializetheHPIlibrary.Pleasecheckyourinstallation,HotSpotdoesnotworkcorrectlywheninsta......
  • 序列化与反序列化的用法
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.IO;n......
  • fastjson反序列化CNVD-2019-22238
    漏洞原理:fastjson是阿里的开源json解析库,用来将json字符串反序列化为JavaBean类,或者将JavaBean类序列化为json字符串。在java审计中,需要关注的关键字:JSON.parse,......
  • 慎用django orm的update_or_create方法
    根据错误日志,发现产生死锁的有4个接口。这4个接口中,阅读业务代码,发现均有使用update_or_create。为什么update_or_create方法会造成死锁呢?通过阅读源码   发现,upd......
  • Spring 循环依赖引起 This is very likely to create a memory leak 问题
    背景:在公司测试环境发布测试的时候,发布失败了。日志报错:Thisisverylikelytocreateamemoryleak 。但是奇怪的是我的本地idea是启动正常的。没问题的。然后就跟运维......
  • C++反序列化--一种基于class infomation反射库的反序列化数据结构
    序列化与反序列化概念:将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将程序数据转化成能被存储并传输的格式的......
  • 关于Android中接口Reponse反序列化的思考
    总结kotlindataclass返回值最佳实践,使用ks!字段全写默认值,不可空,取消全部问号!ks速度更快并且支持N多数据类型protobuf+jsonkt默认值只有两种方式可以获取使用k......
  • 代码审计-PHP反序列化漏洞
    什么是序列化序列化可以实现将对象压缩并格式化,方便数据的传输和存储。为什么要序列化?PHP文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有......
  • Java Graphics2D画图部署到Linux服务器中文出现口口口乱码
    我在使用Graphics2D画图是使用了Font中的宋体,在本地运行非常顺畅,但是部署到服务器之后,发现所有的中文无一例外,都变成了口口口。原因:服务器中没有支持中文各种字体。解......