前后端分离djangorestframework——认证组件
authentication
认证是干嘛的已经不需要多说。而前后端未分离的认证基本是用cookie或者session,前后端分离的一般用token
全局认证
先创建一个django项目,项目名为drfversion,app名为DRF,设置简单的数据库表,并迁移:
model:

view:

url:


启动项目,访问测试,先创建一个用户root,密码123:




写入一个认证类,读源码可知,自定义的认证类必须要定义这个方法:

在项目根目录创建一个utils文件夹,创建auth文件,定义一个认证类,必须继承BaseAuthentication,注意我的代码获取token是通过url的条件而得,通过request.query_params获取:

同样,要应用此认证类,读源码可知,需要在配置文件里作如下配置:

重启项目测试:
第一次,没有带值

从数据库中复制该token值再次测试:

跳转到其他网页查看:

login登录页面也可以:

但是按开发逻辑,登录页面不应该验证token对吧?还没登录怎么能有token呢?是吧,所以不带token:

但是不带token此时又提示必须要带,所以这就是全局认证的弊端
局部认证
先在配置文件里注释掉全局认证:

在视图类里导入自定义的认证类,在需要认证的视图类添加一个类属性 :authentication_classes = [自定义认证类名,]

其他都不用修改,启动测试:
登录页面:

test页面,不带token:

test页面,带上token:

DRF自带的认证类
看了源码,其实还有很多DRF自带的认证类,都在rest_framework.authentication里面,也可以根据需求直接选用DRF自带的认证类

以上项目主要的代码:
根url:
from django.contrib import admin
from django.urls import path, re_path, include
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'auth/', include(('DRF.urls'))),
]
app下url:
from django.urls import path, re_path
from DRF.views import DemoView, LoginView, TestView
urlpatterns = [
path(r'', DemoView.as_view()),
re_path(r'^login/', LoginView.as_view()),
re_path(r'^test/', TestView.as_view()),
]
view:
from rest_framework.views import APIView
from rest_framework.views import Response
from utils.auth import MyAuth
from DRF.models import User
import uuid
class DemoView(APIView):
def get(self, request):
return Response('简单认证')
class LoginView(APIView):
def get(self, request):
return Response('请登录,如果没有账号请创建')
def post(self, request):
user = request.data.get('user')
pwd = request.data.get('pwd')
token = uuid.uuid4()
User.objects.create(user=user, pwd=pwd, token=token)
return Response('创建用户成功')
class TestView(APIView):
authentication_classes = [MyAuth,]
def get(self, request):
return Response('认证测试')
View
model:
from django.db import models
# Create your models here.
class User(models.Model):
user = models.CharField(max_length=32, verbose_name='用户名', null=True, blank=True)
pwd = models.CharField(max_length=32, verbose_name='密码', null=True, blank=True)
token = models.UUIDField()
auth:
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from DRF.models import User
class MyAuth(BaseAuthentication):
def authenticate(self, request):
# 认证token
token = request.query_params.get('token')
if not token:
raise AuthenticationFailed('没有携带token')
user_obj = User.objects.filter(token=token)
if not user_obj:
raise AuthenticationFailed('非法用户')
return (user_obj, token)
settings:
REST_FRAMEWORK = {
"DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion",
"DEFAULT_VERSION": "v1",
"ALLOWED_VERSIONS": "v1, v2",
"VERSION_PARAM": "ver",
# "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MyAuth", ]
}
总结
- 自定义类,必须继承DRF定义好的认证类,需要用什么就继承什么,且根据继承的类不同,必须要定义该基类里明确规定需要的方法或者属性
- 全局认证直接在配置文件里的REST_FRAMEWORK里配置字段"DEFAULT_AUTHENTICATION_CLASSES": ["自定义认证类", ],配置全局认证即表示每个页面都要验证
- 局部认证直接在需要认证的视图类添加属性authentication_classes = [自定义认证类名,]
- 认证可以再url添加条件参数,可以再请求头,可以再请求体,根据认证类的认证类型,在认证时做不同的处理
前后端分离djangorestframework——认证组件的更多相关文章
- 前后端分离djangorestframework——路由组件
在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...
- 前后端分离djangorestframework——分页组件
Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用 前后端分离djangorestframework——序列化与反序列化数据 文章里用到的数据,数据库用的my ...
- 前后端分离djangorestframework——视图组件
CBV与FBV CBV之前说过就是在view.py里写视图类,在序列化时用过,FBV就是常用的视图函数,两者的功能都可以实现功能,但是在restful规范方面的话,CBV更方便,FBV还要用reque ...
- 前后端分离djangorestframework——权限组件
权限permissions 权限验证必须要在认证之后验证 权限组件也不用多说,读了源码你就很清楚了,跟认证组件很类似 具体的源码就不展示,自己去读吧,都在这里: 局部权限 设置model表,其中的ty ...
- 前后端分离djangorestframework——ContentType组件表
ContentType ContentType其实django自带的,但是平时的话很少会用到,所以还是放在Djangorestframework这个部分 作用: 在实际的开发中,由于数据库量级大,所以 ...
- 前后端分离djangorestframework—— 在线视频平台接入第三方加密防盗录视频
加密视频 在以后的开发项目中,很可能有做在线视频的,而在线视频就有个问题,因为在线播放,就很有可能视频数据被抓包,如果这个在线视频平台有付费视频的话,这样就会有人做点倒卖视频的生意了,针对这个问题,目 ...
- 前后端分离djangorestframework—— 接入第三方的验证码平台
关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...
- 前后端分离djangorestframework——序列化与反序列化数据
我们写好后端的代码,要把数据交给前端的展示的,这个数据以什么类型给前端呢?学到这里,我们已经知道这个数据最好是json字符串才行,因为网络间的传输,只认字符串或者二进制,字符串就是我们的数据,二进制就 ...
- 实战!spring Boot security+JWT 前后端分离架构认证登录!
大家好,我是不才陈某~ 认证.授权是实战项目中必不可少的部分,而Spring Security则将作为首选安全组件,因此陈某新开了 <Spring Security 进阶> 这个专栏,写一 ...
随机推荐
- WebWorker与WebSocket实现前端消息总线
Web Worker让JS有了多线程的能力,可以将复杂耗时的操作都交付给Worker线程处理.WebSocket让web端与服务端维持一个有效的长连接,实现服务端主动推送数据.将二者一结合,业务系统信 ...
- 6种字符串数组的java排序 (String array sort)
注意,本文不是字符串排序,是字符串数组的排序. 方法分别是: 1.低位优先键索引排序 2.高位优先建索引排序 3.Java自带排序(经过调优的归并排序) 4.冒泡排序 5.快速排序 6.三向快速排序 ...
- React 中的this.setState
在react中如何修改state中的数据 第一种写法:this.setState() 参数1:对象 需要修改的数据 参数2:回调 this.setState是一 ...
- RSA算法原理——(2)RSA简介及基础数论知识
上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...
- Spring Boot 2.0 教程 | @ModelAttribute 注解
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站: https://www.exception.site/springboot/spring-boot-model-attribute Spri ...
- mac缺少librt问题记录
在mac下编译一个程序的时候遇到错误 ld: library not found for -lrt librt.so主要是glibc对real-time部分的支持.所以一般含有#include< ...
- 死磕 java集合之TreeMap源码分析(二)- 内含红黑树分析全过程
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 插入元素 插入元素,如果元素在树中存在,则替换value:如果元素不存在,则插入到对应的位置, ...
- qt delete
在写博文之前,先推荐一篇文章,我觉着挺不错,也是qt中delete相关:QT父子与QT对象delete 学习C++的童鞋都知道new和delete必须是同时出现的,否则就会导致内存泄露 ...
- IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可)
IdentityServer4之Resource Owner Password Credentials(资源拥有者密码凭据许可) 参考 官方文档:2_resource_owner_passwords ...
- C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. PAT Bas ...