django项目开发模拟auth的做一个登录验证(一)

来源:互联网 发布:如何恢复u盘数据 编辑:程序博客网 时间:2024/05/29 19:23

一、说明

在一个项目开发中涉及到前端与后台管理系统,一般我们后台管理系统使用django中自带的auth作为用户登录退出,及装饰器类的,但是前端页面就需要自己书写了

  • 1、下面列举了常用的auth模块

    from django.contrib.auth.models import Userfrom django.contrib.auth import authenticate, logout, loginfrom django.contrib.auth.decorators import login_required
    • 1、authenticate是校验用户账号与密码是否正确
    • 2、logout, login表示登录与退出的方法
    • 3、login_required登录的装饰器
    • 4、Userdjango中自带的用户表

二、前端页面模拟一个auth的上述功能

  • 1、创建一个前端的app并在settings.py中注册
  • 2、在创建的appmodels.py中创建一个前端用户模型(需要字段自己扩展)

    from __future__ import unicode_literalsfrom django.db import modelsimport uuid# 前端用户的数据模型class FrontUserModel(models.Model):    uid = models.UUIDField(primary_key=True,default=uuid.uuid4)    email = models.EmailField(unique=True)    username = models.CharField(max_length=20)    password = models.CharField(max_length=128)    is_active = models.BooleanField(default=True)    date_joined = models.DateTimeField(auto_now_add=True)    last_joined = models.DateTimeField(auto_now=True)
  • 3、映射到数据库中

  • 4、测试刚刚映射数据模型是否成功(写一个测试的视图存储数据,查看数据库密码是明文保存的)

    from django.http import HttpResponsefrom django.shortcuts import renderfrom frontauth.models import FrontUserModel# 测试代码  def test(request):    user = FrontUserModel(email='aa@qq.com',password='123')    user.save()    return HttpResponse('success')

三、对提交的密码加密处理(简单的使用MD5加密)

主要思路

  • 1、获取到用户提交的密码
  • 2、使用加密算法对提交的明文密码进行加密处理
  • 3、把加密后的密码放到需要提交的字段里面
  • 4、调用保存方法把刚加密后的密码提交到数据库中
  • 5、测试

下面具体实现以上四步加密算法后测试

  • 1、获取到用户提交的密码

    每次我们提交数据都要调用save()方法,在这个方法之前截获提交的明文秘密

    class FrontUserModel(models.Model):    ### 此处省去建表的字段       def __init__(self,*args,**kwargs):        if 'password' in kwargs:            print '*'*100            print kwargs['password']            print '*'*100
  • 2、使用加密算法对提交的明文密码进行加密处理

    import hashlibclass FrontUserModel(models.Model):    ### 此处省去建表的字段       def __init__(self,*args,**kwargs):        if 'password' in kwargs:            # 定义一个加密的盐(随便输入的)            salt = 'sjhahoibsaGHSAoiwhsoa'            password = hashlib.md5(salt+kwargs['password']).hexdigest()            print '*'*100            print password            print '*'*100
  • 3、把加密后的密码放到需要提交的字段里面

    import hashlibclass FrontUserModel(models.Model):    ### 此处省去建表的字段       def __init__(self,*args,**kwargs):        if 'password' in kwargs:            # 定义一个加密的盐(随便输入的)            salt = 'sjhahoibsaGHSAoiwhsoa'            password = hashlib.md5(salt+kwargs['password']).hexdigest()            kwargs['password'] = password
  • 4、调用保存方法把刚加密后的密码提交到数据库中

    import hashlibclass FrontUserModel(models.Model):    ### 此处省去建表的字段       def __init__(self,*args,**kwargs):        if 'password' in kwargs:            # 定义一个加密的盐(随便输入的)            salt = 'sjhahoibsaGHSAoiwhsoa'            password = hashlib.md5(salt+kwargs['password']).hexdigest()            kwargs['password'] = password        # 使用父类的保存方法        super(FrontUserModel, self).__init__(*args, **kwargs)    
  • 5、测试

四、用户登录校验密码(就是一个解密的过程)

主要步骤

  • 1、截获用户输入的密码,对其再一次使用上面的方式加密
  • 2、加密后的密码去与数据库里面的密码匹配
  • 3、返回True或者False
  • 4、测试

    # 定义一个校验密码的def check_password(self,raw_password):    if not raw_password:        return False    # 定义一个加密的盐(注意这个要复制上面的)    salt = 'sjhahoibsaGHSAoiwhsoa'    hash_password = hashlib.md5(salt + raw_password).hexdigest()    if self.password == hash_password:        return True    else:        return False
    # 测试代码  def test(request):    # user = FrontUserModel(email='aab@qq.com',password='123')    # user.save()    email = 'aab@qq.com'    password = '123'    user = FrontUserModel.objects.filter(email=email).first()    if user.check_password(password):        return HttpResponse('success')    else:        return HttpResponse('fail')

五、修改密码的方法

  • 1、修改密码的方法

    # 定义一个修改密码的方法 def set_password(self, raw_password):    if not raw_password:        return None    # 定义一个加密的盐(注意这个要复制上面的)    salt = 'sjhahoibsaGHSAoiwhsoa'    hash_password = hashlib.md5(salt + raw_password).hexdigest()    self.password = hash_password    self.save(update_fields=['password'])
  • 2、测试

    # 测试代码  def test(request):    # user = FrontUserModel(email='aab@qq.com',password='123')    # user.save()    email = 'aab@qq.com'    password = '234'    user = FrontUserModel.objects.filter(email=email).first()    user.set_password('234')    return HttpResponse('success')

六、整理上面代码(抽取公共部分)

  • 1、全部的盐可以提取出来,定义在一个配置文件里面

    **configs.py文件中**# 定义一个盐PASSWORD_SALT = 'sjhahoibsaGHSAoiwhsoa'
  • 2、加密的方法也重复多次写了

    **hashers.py文件**import configsimport hashlib# 定义一个加密的方法def make_password(raw_password,salt=None):    if not salt:        salt = configs.PASSWORD_SALT    hash_password = hashlib.md5(salt+raw_password).hexdigest()    return hash_password# 定义一个解密的方法def check_password(raw_password,hash_password):    if not raw_password:        return False    tmp_password = make_password(raw_password)    if tmp_password == hash_password:        return True    else:        return False
  • 3、使用

    # -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.db import modelsimport uuidfrom hashers import make_password, check_passwordclass FrontUserModel(models.Model):    uid = models.UUIDField(primary_key=True, default=uuid.uuid4)    email = models.EmailField(unique=True)    username = models.CharField(max_length=20)    password = models.CharField(max_length=128)    is_active = models.BooleanField(default=True)    date_joined = models.DateTimeField(auto_now_add=True)    last_joined = models.DateTimeField(auto_now=True)    def __init__(self, *args, **kwargs):        if 'password' in kwargs:            password = make_password(kwargs['password'])            kwargs['password'] = password        # 使用父类的保存方法        super(FrontUserModel, self).__init__(*args, **kwargs)    # 定义一个校验密码的    def check_password(self, raw_password):        return check_password(raw_password, self.password)    # 定义一个修改密码的方法    def set_password(self, raw_password):        if not raw_password:            return None        hash_password = make_password(raw_password)        self.password = hash_password        self.save(update_fields=['password'])
  • 4、测试

七、使用加密模块来进行加密

可以参考我之前tornado处理加密的方式进行加密传送门,就不说怎么安装与使用模块了,直接上案例

  • 1、导包

    from pbkdf2 import PBKDF2
  • 2、书写写入,校验,修改密码的方法

    # 使用pbkdf2第三方加密模块来处理class WebUserModel(models.Model):    uid = models.UUIDField(primary_key=True, default=uuid.uuid4)    email = models.EmailField(unique=True)    username = models.CharField(max_length=20)    password = models.CharField(max_length=128)    is_active = models.BooleanField(default=True)    date_joined = models.DateTimeField(auto_now_add=True)    last_joined = models.DateTimeField(auto_now=True)    def __init__(self, *args, **kwargs):        if 'password' in kwargs:            # iterations表示迭代多少次            new_password = PBKDF2.crypt(kwargs['password'], iterations=1024)            kwargs['password'] = new_password        # 使用父类的保存方法        super(WebUserModel, self).__init__(*args, **kwargs)    # 定义一个校验密码的方法    def check_password(self, raw_password):        if not raw_password:            return False        return self.password == PBKDF2.crypt(raw_password, self.password)    # 定义一个修改密码的方法    def set_password(self, raw_password):        if not raw_password:            return None        new_password = PBKDF2.crypt(raw_password, iterations=1024)        self.password = new_password        self.save(update_fields=['password'])
  • 3、测试

八、个人建议使用pbkdf2模块加密方式,或者推荐使用自定义加密方式传送门

原创粉丝点击