【DRF认证】
本文详细讲述了DRF认证组件的原理以及用法.
@
源码剖析
上一篇博客讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始化我们的版本.
而在initial方法里有我们的认证、权限、频率组件,如下图:

我们再点进去认证组件看看:

可以看到,我们的权限组件返回的是request.user,那么这里返回的request是新的还是旧的呢?
initial方法是在request重新赋值之后执行的,所以我们这里的request是新的——也就是Request类的实例化对象.
所以,这个user一定是一个静态方法,我们进去看看:


我没在这里反复的截图跳转页面,大家可以尝试着自己去找.
通过上面的分析,我们基本可以知道我们的认证类一定要实现的方法、返回值的类型,以及视图中要配置的参数:authentication_classes = ["认证组件类", ]
如果需要全局验证,则在配置文件中加上此配置:
REST_FRAMEWORK = {
# 配置全局认证
'DEFAULT_AUTHENTICATION_CLASSES': ["blog.auth.MyAuth", ],
}
认证组件的详细用法
第一步 准备数据库文件和数据
·# models.py
from django.db import models class UserInfo(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
token = models.UUIDField(null=True, blank=True)
数据如下:
mysql> select * from blog_userinfo;
+----+-----------+-----------+-------+
| id | name | pwd | token |
+----+-----------+-----------+-------+
| 1 | 花千骨 | huaqiangu | |
+----+-----------+-----------+-------+
1 row in set (0.00 sec)
第二步 自定义一个认证类
from rest_framework.authentication import BaseAuthentication # > 导入认证类
from rest_framework.exceptions import AuthenticationFailed # 用于抛出错误信息
from .models import UserInfo # 导入用户信息表 class MyAuth(BaseAuthentication):
def authenticate(self, request):
"""自定义的认证类中必须有此方法以及如下的判断和两个返回值""" # 1. 获取token
token = request.query_params.get('token') # 2. 判断是否成功获取token
if not token:
raise AuthenticationFailed("缺少token") # 3. 判断token是否合法
try:
user_obj = UserInfo.objects.filter(token=token).first()
except Exception:
raise AuthenticationFailed("token不合法") # 4. 判断token在数据库中是否存在
if not user_obj:
raise AuthenticationFailed("token不存在") # 5. 认证通过
return (user_obj.name, user_obj)
# 注意,权限组件会用到这两个返回值
第三步
urls.pyfrom django.conf.urls import url
from blog.views import LoginView, TestAuthView urlpatterns = [
url(r'^login/$', LoginView.as_view()), # 用于登陆
url(r'^test/$', TestAuthView.as_view()), # 用于认证测试
]
第四步
views.pyfrom rest_framework.views import APIView
from rest_framework.response import Response
from .auth import MyAuth # 导入自定义的认证组件
from .models import UserInfo # 导入用户信息表
import uuid # 用于生成uuid class LoginView(APIView):
"""用于登陆验证并生成UUID的视图""" def post(self, request):
name = request.data.get('name')
pwd = request.data.get('pwd')
user_obj = UserInfo.objects.filter(name=name, pwd=pwd).first()
if user_obj:
u4 = uuid.uuid4() # 生成uuid4
user_obj.token = u4
user_obj.save()
return Response(u4)
return Response("用户名或密码错误") class TestAuthView(APIView):
"""用于认证测试的视图""" # 在视图中增加此配置,即表明此视图要走认证逻辑认证
# 认证组件可以写多个
authentication_classes = [MyAuth, ] def get(self, request):
return Response("认证测试")
好了,我们来测试吧.
首先,登陆并生成UUID:
成功提交数据后,将生成并返回UUID:
然后,复制UUID,去测试认证:
如果我们不指定token:
或者指定错误的、不存在的token,都将被抛出错误.
is ok.
【DRF认证】的更多相关文章
- DRF 认证、权限、限制
DRF 认证.权限.限制 认证: 定义一个用户表和一个保存用户的Token表 # ======================day96======================= class ...
- python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)
昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...
- (四) DRF认证, 权限, 节流
一.Token 认证的来龙去脉 摘要 Token 是在服务端产生的.如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 To ...
- drf 认证功能
drf(django rest-framework)认证组件 复习 HyperlinkedIdentityField ```python 功能:快速生成连接 1. publish = seriali ...
- drf认证组件、权限组件、jwt认证、签发、jwt框架使用
目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...
- DRF认证组件
1.DRF认证组件之视图注册用法(自定义简单使用) settings.py配置 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.a ...
- 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用
因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...
- drf 认证、权限、限流、过滤、排序、分页器
认证Authentication 准备工作:(需要结合权限用) 1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py creates ...
- Django -- DRF 认证流程
Django Restful Framework (DRF)中类的调用与自定义-- 以 autentication 认证为例 DRF 的 request 对 django 的 request 进行了更 ...
随机推荐
- MFC的学习路线
首先,MFC是比较难的!比C#和VB要难得多.MFC是基于C++的.首先C++必须熟悉.MFC主要是学习里面的控件的使用. 建议学习路线: 1. 易语言中文编程从入门到精通: https://deta ...
- 用VUE做网站后台
介绍: 这是一个用vuejs2.0和element搭建的后台管理界面. 相关技术: vuejs2.0:渐进式JavaScript框架,易用.灵活.高效,似乎任何规模的应用都适用. element:基于 ...
- CF949C Data Center Maintenance(建图+强联通分量)
题意 有 n 个信息中心,第 i 个信息中心要在第 ti 个小时维护,维护期间信息不能被获得. 每个用户的数据都有两份备份,第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2). 现在要挑 ...
- 学习优化《机器学习与优化》中文PDF+英文PDF
正在学习机器学习中的优化处理,感觉<机器学习与优化>写得还是比较通俗易懂的,第七章特征选择我需要,特征提取:相关系数,相关比,熵和互信息..更高级的应该是文本挖掘的特征提取,比如LDA提取 ...
- oracle 12c 关于wm_concat 的替换;LISTAGG
之所以用到了wm_concat函数.是想到达这样的结果集. 转为这样的===========> 返回这样的数据,易与配合echarts的数据准备. 看上去十分的方便,但是遗憾的是,oracle极 ...
- vuex 闲置状态重置方案
前言 大型单页应用(后面都是指spa),我们往往会通过使用状态管理器 vuex 去解决组件间状态共享与状态传递等问题.这种应用少则几十个单页,多则上百个单页.随着路由的频繁切换,每个路由对应的 vue ...
- ubuntu中开启、关闭防火墙
1.关闭ubuntu的防火墙 ufw disable 开启防火墙 ufw enable 2.卸载了iptables apt-get remove iptables 3.关闭 ...
- Windows远程登录Linux
本文以Ubuntu Kylin1404为例,说明如何通过Windows远程登录Linux. 首先,要确保Ubuntu上SSH服务执行正常.默认情况下,Ubuntu已装有SSHclient.比方输入ss ...
- HBase源代码分析之HRegion上MemStore的flsuh流程(二)
继上篇<HBase源代码分析之HRegion上MemStore的flsuh流程(一)>之后.我们继续分析下HRegion上MemStore flush的核心方法internalFlushc ...
- BZOJ 3940 AC自动机
思路: 需要维护一个栈的AC自动机--. 要求出来 最后的栈顶是在自动机上的哪个节点. if(!ac.ch[st[tp-1]][a[i]-'a']) st[tp]=ac.ch[ac.f[st[tp-1 ...



