qhfl-4 注册-登录-认证
认证
任何的项目都需要认证,当用户输入了用户名和密码,验证通过,代表用户登录成功
那HTTP请求是无状态的,下次这个用户再请求,是不可能识别这个用户是否登录的
就要有自己的方式来实现这个认证,用户登录成功以后,生成一个随机字符串,以后这个用户再请求,都要携带这个随机字符串。
就可以根据这个字符串进行判断这个用户是否登录,目的是前端发送请求的时候带过来就可以,以前的cookie,session是的一种解决方案,认证的时候也用过token的这种解决方案。
token
用户登录成功后,生成一个随机字符串token给前端返回
那么前端以后都携带这个token来访问这样只需要鉴别这个token来做认证
前端如果发送请求把token放在请求头中看下的认证要怎么写
序列化注册数据
测试的时候用的重写create方法,真正开发前端传过来的就是加密后的密文密码
from rest_framework import serializers
from Course.models import Account
import hashlib class RegisterSerializer(serializers.ModelSerializer): class Meta:
model = Account
fields = "__all__" def create(self, validated_data):
pwd = validated_data["pwd"]
pwd_salt = "luffy_password" + pwd # 加盐处理
md5_str = hashlib.md5(pwd_salt.encode()).hexdigest()
user_obj = Account.objects.create(username=validated_data["username"], pwd=md5_str)
return user_obj
Login/serializers.py
注册,登录的视图
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import RegisterSerializer
from utils.base_response import BaseResponse
from Course.models import Account
from utils.redis_pool import POOL
import redis
import uuid
from utils.my_auth import LoginAuth
from utils.geetest import GeetestLib
from django.http import HttpResponse
import json # Create your views here. class RegisterView(APIView): def post(self, request):
res = BaseResponse() # 实例化响应类
# 用序列化器做校验
ser_obj = RegisterSerializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
res.data = ser_obj.data
else:
res.code = 1020
res.error = ser_obj.errors
return Response(res.dict) class LoginView(APIView): def post(self, request):
res = BaseResponse()
username = request.data.get("username", "")
pwd = request.data.get("pwd", "")
user_obj = Account.objects.filter(username=username, pwd=pwd).first()
if not user_obj:
res.code = 1030
res.error = "用户名或密码错误"
return Response(res.dict)
# 用户登录成功生成一个token写入redis
# 写入redis token : user_id
conn = redis.Redis(connection_pool=POOL) # 从连接池获取一个连接
try:
token = uuid.uuid4()
conn.set(str(token), user_obj.id, ex=10000)
# conn.set(str(token), user_obj.id) # str(token) 用作key
res.data = token
except Exception as e:
print(e)
res.code = 1031
res.error = "创建令牌失败"
return Response(res.dict)
Login/views.py
class BaseResponse(object):
"""
封装响应的类
"""
def __init__(self):
self.code = 1000
self.data = None
self.error = None @property
def dict(self):
return self.__dict__ # 返回字典
utils/base_response.py
认证器
http头部发送的字段信息 key:value
在服务器接受时,需要加上前缀(并且大写)例如 HTTP_KEY ,通过 request.META.get(HTTP_KEY) 获取值
import redis from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed from .redis_pool import POOL
from Course.models import Account CONN = redis.Redis(connection_pool=POOL) class LoginAuth(BaseAuthentication):
def authenticate(self, request):
# 从请求头中获取前端带过来的token。或者跟前端商量好
token = request.META.get("HTTP_AUTHENTICATION", "")
# print(request.META)
# print(token)
if not token:
raise AuthenticationFailed("没有携带token")
# 去redis比对
user_id = CONN.get(str(token)) # get没有的值返回 None
if user_id == None:
raise AuthenticationFailed("token过期") # 重新登录设置token
user_obj = Account.objects.filter(id=user_id).first()
return user_obj, token
utils/my_auth.py
用到的redis连接池
import redis POOL = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True, max_connections=10)
utils/redis_pool.py
注册用户测试

测试发送密码时为密文。前端传过来,后端加密后再与数据库中的比对

以token为key存放在redis中,登录成功后返回生成的token数据(有有效期的),下次登录时携带上。后端以传过来的token 去reids中找,能找到就拿到用户信息,不能就说明过期需要重新登录,或者token不存在.

qhfl-4 注册-登录-认证的更多相关文章
- Django框架(十八)—— auth框架:用户登录、注册、认证
目录 auth模块 一.什么是author模块 二.auth模块的使用 1.创建超级用户(create_superuser()) 2.验证用户(authenticate()) 3.登录用户(login ...
- vue2.0+koa2+mongodb实现注册登录
前言 前段时间和公司一个由技术转产品的同事探讨他的职业道路,对我说了一句深以为然的话: "不要把自己禁锢在某一个领域,技术到产品的转变,首先就是思维上的转变.你一直做前端,数据的交互你只知道 ...
- Java结合SpringBoot拦截器实现简单的登录认证模块
Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- 基于SpringBoot搭建应用开发框架(二) —— 登录认证
零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...
- python相关注册登录方式
1.使用django自带功能实现登录/退出登录 使用django自带登录功能,前提生成用户(用户注册)使用的是django自带的user,或称models中用户表继承于django自带的user 1. ...
- Luffy之登录认证以及JWT
1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...
- spring boot 登录认证
玩转spring boot——简单登录认证 https://www.cnblogs.com/GoodHelper/p/6343190.html 玩转spring boot——简单登录认证 https: ...
- SpringMVC拦截器实现登录认证(转发)
感谢原作者,转发自:http://blog.csdn.net/u014427391/article/details/51419521 以Demo的形式讲诉拦截器的使用 项目结构如图: 需要的jar:有 ...
随机推荐
- 红外NEC协议
注意: 用示波器在接收头抓的电平看起来和NEC协议刚好相反, 那是因为:HS0038B 这个红外一体化接收头,当收到有载波的信号的时候,会输出一个低电平,空闲的时候会输出高电平. 具体情况,具体分析. ...
- WPF 去掉Drag a column header here to group by that column
<dxg:GridControl.View> <dxg:TableView x:Name="view" ShowGroupPanel="False&qu ...
- Axiso解决跨域访问(...XMLHttpRequest cannot load http://xxx.xxx No 'Access-Control-Allow-Origin'...)
直接访问如下:this.$axios.get("http://localhost:8089/yc/demo").then(res=>{ console.log(res) ...
- Java内存管理之类似-Xms、-Xmx 这些参数的含义
1.堆内存分配:JVM 初始分配的内存由**-Xms** 指定,默认是物理内存的 1/64:JVM 最大分配的内存由**-Xmx** 指定,默认是物理内存的 1/4:默认空余堆内存小于 40% 时,J ...
- IDEA jrebet插件安装
破解.exe下载 https://github.com/ilanyu/ReverseProxy/releases/tag/v1.0 双击运行,exe 文件, 然后IDEA -> Help -&g ...
- 如何在js中使用递归
很久没写博客了... 内容后补
- Linux网络编程学习(五) ----- 信号(第四章)
1.基本概念 进程阻塞: 进程执行条件得不到满足,就自动放弃CPU资源而进入休眠状态,以等待条件满足,当条件满足时,系统就将控制权还给该进程进行未完成的操作 共享资源: 进程间协调使用的系统资源 锁定 ...
- html css col-md-offset
有的时候,我们不想让两个相邻的列挨在一起,这时候利用栅格系统的列偏移(offset)功能来实现,而不必再定义margin值.使用.col-md-offset-*形式的样式就可以将列偏移到右侧.例如,. ...
- Halcom学习笔记1——Halcon知识点
文件: 1.浏览HDevelop示例程序 2.程序另存在:Ctrl+Shift+S 3.导出:Ctrl+Shift+O X 编辑: 1.快捷键: F3 激活 F4 注销 重复查找:C ...
- 项目(三)PXE高效能批量网络装机
PXE:预启动执行环境 PXE是由intel公司开发的网络引导技术,工作在Client/Server模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统. 若要搭建PXE网 ...