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、
User
是django
中自带的用户表
- 1、
二、前端页面模拟一个auth
的上述功能
- 1、创建一个前端的
app
并在settings.py
中注册 2、在创建的
app
的models.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
模块加密方式,或者推荐使用自定义加密方式传送门
阅读全文
0 0
- django项目开发模拟auth的做一个登录验证(一)
- django项目开发模拟auth的做一个登录验证(二)
- django 自定义auth的中间件的验证
- Django auth登录
- 从零开始做一个有后端,有短信验证,mvp架构,真正的登录注册小项目(一)
- Laravel- Auth登录验证
- 模拟登录Django csrf验证 及 django_cas_server 模块验证
- Android 使用.net开发的webservice做用户登录验证
- Laravel5.3使用auth登录验证
- Django开发myblog自己一步步做的(一)
- 用django-social-auth 做中国社交网站三方登录(qq,微博,豆瓣,百度,人人,微信支持)
- Django框架下使用ajax模拟用户登录验证
- pythonWeb -- Django开发-创建一个Django项目
- Django 1.11 用户注册登录(2) 用自带的auth模块
- Django Auth
- 关于Django的验证用户名密码登录
- Django 一个简单的图书管理程序(一建立项目)
- Django登录验证
- IO
- 二分查找---膨胀的木棍
- JS实现带有logo的二维码
- 使用 CodeMirror 打造属于自己的在线代码编辑器
- python3 内置核心数据类型
- django项目开发模拟auth的做一个登录验证(一)
- SpringBoot事务的使用
- 投影纹理与最小细节层级的混合应用
- Java集合框架--MapTest
- LDA主题模型三连击-入门/理论/代码
- django项目开发模拟auth的做一个登录验证(二)
- JAVA包装类及其拆箱装箱及Integer类拆装箱的细节
- 现代操作系统之多处理机系统(中)
- 策略模式