• django 从零开始 9 自定义密码验证加密


    先上想法,想对数据库账号的密码进行一个加密,但是django文档中的加密方法set_password貌似是只针对他们默认的user模型 或者继承 AbstractBaseUser的模型有效

    from django.contrib.auth.models import AbstractBaseUser
    from django.contrib.auth.models import User

    其中set_password 就是对make_password进行一层封装  直接在用户注册保存时 user.set_password = password 进行加密

    验证密码也是对其封装 check_passwrod封装                   ................

    如果自定义按照我下面的方法,但是没有request.user了


    于是想在自己定义的模型中使用,查了查文档发现 那不就和 flask的werkzegu 中的两个加密方式一样

    只是有一些小坑需要注意

    
    
    from django.contrib.auth.hashers import make_password,check_password


    class
    User(models.Model): class Meta: db_table = 'user' name = models.CharField(max_length=20,null=True,unique=True) password = models.CharField(max_length=128) create_date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name def _set_password(self,password): self.password = make_password(password) def _check_password(self,password): return check_password(password,self.password)

    简单的用户模型 其中_set_password 是我对需要进行保存的数据 进行一个密码加密 默认不做任何改动

    _check_password 是对查询到的用户 进行一个验证,不过这就是这个坑点了,

    在flask中验证密码是

    def _check_password(self,password):
        return check_password(self.password,passowrd) 

    先对查询到用户使用这个方法_check_password ,直接填入用户输入的明文密码对其验证就可以了

    但是django 的参数位置和flask的相反,是先明文,在加密,容易以为是密码错误

    # 源码
    def check_password(password, encoded, setter=None, preferred='default'):

    先明文密码,后加密密码 但我这个是类方法,其实和flask一样直接填写就好了,直接设置好了,不需要管参数位置

    提醒在视图函数中使用这个加密方式 会出现这种问题    切记切记

     1 def login(request):
     2     if request.POST.method == 'POST':
     3         name = request.POST.get('name')
     4         password = request.POST.get('password')
     5         user = User.objects.filter(name=name).first()
     6         if user:
     7             if user._check_password(password)
     8                 # 舍弃掉 from django.contrib.auth import authenticate
     9                 # 换成自定义登录 authenticate毕竟只是对数据库查询该用户是否存在,但是如果加密,那么password字段查询还需要加密.. 算了
    10                 # 但是还用用 login对其用户session添加字段
    11                 login(request,user)
    12                 return redirect(revsrse('user:inde'))
    13             else:
    14                 return render(request,'login.html',{"msg":"账号密码不匹配"})
    15          else:
    16              return render(request,'login.html',{"msg":"账号密码不匹配"})
    17 
    18 
    19     return  return render(request,'login.html')

    引用 https://blog.csdn.net/qq_27437781/article/details/86002317

  • 相关阅读:
    NLP Best Practices
    Bert模型精简方法
    delphi:对象的创建(create)与释放(free/destory)(转载)
    delphi:Format格式化函数(转载)
    delphi:destroy, free, freeAndNil, release用法和区别(转载)
    delphi:function ParamStr(i:LongInt):string
    jquery:上传文件
    bootstrapValidator中用ajax校验
    jquery中实时监控文本框的变化
    jquery判断checkbox是否选中
  • 原文地址:https://www.cnblogs.com/zengxm/p/11317489.html
Copyright © 2020-2023  润新知