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——认证组件的更多相关文章

  1. 前后端分离djangorestframework——路由组件

    在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...

  2. 前后端分离djangorestframework——分页组件

    Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用  前后端分离djangorestframework——序列化与反序列化数据  文章里用到的数据,数据库用的my ...

  3. 前后端分离djangorestframework——视图组件

    CBV与FBV CBV之前说过就是在view.py里写视图类,在序列化时用过,FBV就是常用的视图函数,两者的功能都可以实现功能,但是在restful规范方面的话,CBV更方便,FBV还要用reque ...

  4. 前后端分离djangorestframework——权限组件

    权限permissions 权限验证必须要在认证之后验证 权限组件也不用多说,读了源码你就很清楚了,跟认证组件很类似 具体的源码就不展示,自己去读吧,都在这里: 局部权限 设置model表,其中的ty ...

  5. 前后端分离djangorestframework——ContentType组件表

    ContentType ContentType其实django自带的,但是平时的话很少会用到,所以还是放在Djangorestframework这个部分 作用: 在实际的开发中,由于数据库量级大,所以 ...

  6. 前后端分离djangorestframework—— 在线视频平台接入第三方加密防盗录视频

    加密视频 在以后的开发项目中,很可能有做在线视频的,而在线视频就有个问题,因为在线播放,就很有可能视频数据被抓包,如果这个在线视频平台有付费视频的话,这样就会有人做点倒卖视频的生意了,针对这个问题,目 ...

  7. 前后端分离djangorestframework—— 接入第三方的验证码平台

    关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...

  8. 前后端分离djangorestframework——序列化与反序列化数据

    我们写好后端的代码,要把数据交给前端的展示的,这个数据以什么类型给前端呢?学到这里,我们已经知道这个数据最好是json字符串才行,因为网络间的传输,只认字符串或者二进制,字符串就是我们的数据,二进制就 ...

  9. 实战!spring Boot security+JWT 前后端分离架构认证登录!

    大家好,我是不才陈某~ 认证.授权是实战项目中必不可少的部分,而Spring Security则将作为首选安全组件,因此陈某新开了 <Spring Security 进阶> 这个专栏,写一 ...

随机推荐

  1. [Swift]LeetCode871. 最低加油次数 | Minimum Number of Refueling Stops

    A car travels from a starting position to a destination which is target miles east of the starting p ...

  2. Python数据挖掘指南

    Data Mining in Python: A Guide 转载原文:https://www.springboard.com/blog/data-mining-python-tutorial/(全英 ...

  3. 【译】如何高效的使用 Git

    原文链接 代码昨天还是运行好好的今天就不行了. 代码被删了. 突然出现了一个奇怪的 bug,但是没人知道怎么回事. 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的. 除了知道 git add ...

  4. WebSocket(4)---实现定时推送比特币交易信息

    实现定时推送比特币交易信息 实现功能:跟虚拟币交易所一样,时时更新当前比特币的价格,最高价,最低价,买一价等等...... 提示:(1)本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocke ...

  5. Zara带你快速入门WPF(1)---开篇

    一.引言 我们时常可以看到园友们在讨论WPF与WinForm!它们两个的激情对决,看到大家热情洋溢的评论,搞技术的我也是深受感动. 二.走势 但抱歉的是,我无法预测未来WPF会怎么样.乔布斯说过这么一 ...

  6. bootstrap4的出现(或这篇文章可以叫做bs4与bs3的区别)

    前言:在bootstrap4出现之后修改了bootstrap3的不方便之处,让使用框架的前端开发者更加便捷..(bootstrap下文中简称为bs) 一.栅格系统 相对于原来的bs3,bs4具有了范围 ...

  7. java基础(十七)----- 浅谈Java中的深拷贝和浅拷贝 —— 面试必问

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  8. .NET Core中的数据保护组件

    原文地址: PREVENTING INSECURE OBJECT REFERENCES IN ASP.NET CORE 2.0 作者: Tahir Naushad 背景介绍 在 OWASP(开放式 W ...

  9. Python爬虫入门教程 30-100 高考派大学数据抓取 scrapy

    1. 高考派大学数据----写在前面 终于写到了scrapy爬虫框架了,这个框架可以说是python爬虫框架里面出镜率最高的一个了,我们接下来重点研究一下它的使用规则. 安装过程自己百度一下,就能找到 ...

  10. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...