Django实现接口自动化平台(二)认证授权登录【持续更新中】

news2025/1/12 3:03:55

上一章:

Django实现接口自动化平台(一)日志功能【持续更新中】_做测试的喵酱的博客-CSDN博客

下一章:

Django实现接口自动化平台(三)实现注册功能【持续更新中】_做测试的喵酱的博客-CSDN博客

一、认证与授权配置

1、认证:获取权限的方式
2、授权:通过认证之后,可以获取哪些权限

通过APIVIew实现认证与授权。

APIVIew源码:

class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
    throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS
    metadata_class = api_settings.DEFAULT_METADATA_CLASS
    versioning_class = api_settings.DEFAULT_VERSIONING_CLASS

3、常用的认证机制:

  • Session认证
  • Token认证 

Session认证特点:

  • 保持在服务端,消耗服务器性能
  • 分布式架构中,难以维持Session会话同步
  • CSRF攻击风险

Token认证 :

  • 保存在客户端
  • 跨平台、跨语言
  • 拓展性强
  • 鉴权性能高

1.1 配置项目的认证与授权

在setting.py文件中,

REST_FRAMEWORK = {


    # 指定使用的认证类
    # a.在全局指定默认的认证类(指定认证方式)
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # b.Session会话认证
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ],
    # 指定使用的权限类
    # a.在全局指定默认的权限类(当认证通过之后,可以获取何种权限)
    'DEFAULT_PERMISSION_CLASSES': [
        # AllowAny不管是否有认证成功,都能获取所有权限
        # IsAdminUser管理员(管理员需要登录)具备所有权限
        # IsAuthenticated只要登录,就具备所有权限
        # IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ],
}

1、指定使用的认证类
  在全局指定默认的认证类(指定认证方式)
 

  'DEFAULT_AUTHENTICATION_CLASSES': [
        # b.Session会话认证
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ],


2、指定使用的权限类
在全局指定默认的权限类(当认证通过之后,可以获取何种权限)

    'DEFAULT_PERMISSION_CLASSES': [
        # AllowAny不管是否有认证成功,都能获取所有权限
        # IsAdminUser管理员(管理员需要登录)具备所有权限
        # IsAuthenticated只要登录,就具备所有权限
        # IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ],
  1.  AllowAny不管是否有认证成功,都能获取所有权限
  2.  IsAdminUser管理员(管理员需要登录)具备所有权限
  3.  IsAuthenticated只要登录,就具备所有权限
  4.  IsAuthenticatedOrReadOnly,如果登录了就具备所有权限,不登录只具备读取数据的权限

二、配置数据库

在settings.py 文件中,DATABASES 配置数据库信息

DATABASES = {
    'default': {
        # mysql数据库的引擎
        'ENGINE': 'django.db.backends.mysql',
        # 数据库的名称,需要连接mysql下具体某一个数据库的名称
        'NAME': 'my_django',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

具体的数据库配置方式,参考:

django ORM框架(操作数据库)第一章_做测试的喵酱的博客-CSDN博客

三、初始化用户系统

1、生成迁移脚本

python manage.py makemigrations

2、执行迁移脚本

python manage.py migrate

3、创建超级管理员

python manage.py createsuperuser

设置超级管理员的账号和密码。

 miaojiang

cs123456

四、可浏览api页面(登录路由配置)可忽略,不重要

1、在全局urls.py文件中设置登录路由


urlpatterns = [


    # 在全局路由表中添加rest_framework.urls子路由
    # a.rest_framework.urls提供了登录和登出功能(返回的是一个HTML页面,并不是接口)
    path('api/', include('rest_framework.urls'))
]

2、局setting.py文件中,注释掉csrf

五、自定义Users模块(可忽略)

当Django自带用户模块,不能满足我们需要时,需要自自定义用户模块

这里我们使用自定义的user模块,需要继承系统自带的User模块。

1、创建users应用

python3 manage.py startapp users

2、注册users应用,在setting.py文件中,注册users

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users'
]

3、自定义用户模块,继承User

from django.db import models
from django.contrib.auth.models import User


class UserModel(User):
    mobile = models.CharField(max_length=11)
    username = models.CharField()

4、在setting文件中,设置自定义用户模块

# 指定使用的用户模型类,默认为auth子应用下的User
AUTH_USER_MODEL = 'users.UserModel'

六、JWT类型的Token介绍 (简单了解)

原文地址:

https://www.cnblogs.com/crowbrother/p/14813754.html

JWT:Json Web Token 字符串

eyJhbGciOiI6IkRFRiJ9.eNqEj0GOhCAURO_ohbw8ZqUaEUDMe6F.2A2jGp9sAw-QdkOVmm_dfD6Q

一个JWT实际上就是一个字符串,它由三部分组成:header头部、playload载荷、sign签名。 

 6.1 header头部 

描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。表示成一个JSON对象,经base64编码形成第一部分。
例如:

{
  'typ': 'JWT', //类型
  'alg': 'HS256' //sign的加密算法
}

base64编码:eyJhbGciOiI6IkRFRiJ9

6.2 playload载荷

其实就是自定义的数据,一般存储用户Id,用户名、过期时间等信息。也就是JWT的核心所在,因为这些数据就是使后端知道此token是哪个用户已经登录的凭证。而且这些数据是存在token里面的,由前端携带,所以后端几乎不需要保存任何数据。
例如:

{
  'uid': '1234567', //用户编号
  'name': 'kobe', //用户名
  'exp': '20210526121212' //过期时间 
}

base64编码:eNqEj0GOhCAURO_ohbw8ZqUaEUDMe6F

6.3 sign签名

1.头部和载荷各自由base64加密后用 连接起来,然后就形成了xxx.yyy的前两段token。

2.最后一段token的形成:前两段字符串xxx.yyy 加入一个密钥用sha256算法或者其他算法加密形成不可逆的密文sign。

哈希算法生成的sign:2A2jGp9sAw-QdkOVmm_dfD6Q

pip install pyjwt

七、Django 使用jwt token 认证

7.1 应用jwt token认证

1、安装djangorestframework-jwt

pip install djangorestframework-jwt

2、在setting文件中,认证方式,增加jwt token认证        

REST_FRAMEWORK = {


    # 指定使用的认证类
    # a.在全局指定默认的认证类(指定认证方式)
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 1)指定使用JWT TOKEN认证类
        
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        # b.Session会话认证
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication'
    ],

}

3、在全局路由表中添加obtain_jwt_token路由(可以使用用户名和密码进行认证)

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
 
    path('user/login/', obtain_jwt_token),
]

4、启动项目,进行登录

启动项目:

python manage.py runserver

启动项目,访问 127.0.0.1:8000/user/login,

post 请求 , 使用上面创建的超级用户miaojiang进行登录

 登录成功,返回一个token信息。

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6Im1pYW9qaWFuZyIsImV4cCI6MTY4NTQzNjUzNywiZW1haWwiOiIxNDIxOTE0NDY3QHFxLmNvbSJ9.mALGDOW1TFRuz81svmPljMDIbuuy3GlTDsqKJPE6PNo"
}

5、使用jwt token 做请求

将token值设置请求头参数,key为Authorization,value为JWT token值

 注意,JWT 与token之间,有一个空格。

7.2 设置token过期时间

在setting.py中设置

import datetime

JWT_AUTH = {

    # 指定TOKEN过期时间,默认为5分钟,可以使用JWT_EXPIRATION_DELTA指定
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),

}

指定TOKEN过期时间,默认为5分钟,可以使用JWT_EXPIRATION_DELTA指定。

7.3 自定义登录返回信息

上述登录,返回信息只有一个token,我们想要将用户的一些其他信息也返回给前端。通过重写

jwt_response_payload_handler 方法实现。

1、在utils文件夹下,新建handle_jwt_response.py

def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'user_id': user.id,
        'username': user.username,
        'token': token
    }

将我们需要的信息,返回。

2、在setting.py文件中,指定刚刚自定义的方法


JWT_AUTH = {

    # 修改处理payload的函数
    'JWT_RESPONSE_PAYLOAD_HANDLER':
        'utils.handle_jwt_response.jwt_response_payload_handler',
}

八、Django 使用bearer token 认证

实现功能:

修改JWT TOKEN认证请求头中Authorization value值的前缀,默认为JWT

具体方法:

在setting.py文件中,定义JWT_AUTH = {},JWT_AUTH_HEADER_PREFIX 的值为 bearer

JWT_AUTH = {
    # 修改JWT TOKEN认证请求头中Authorization value值的前缀,默认为JWT
    'JWT_AUTH_HEADER_PREFIX': 'bearer',

}

使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FineBI6.0基础学习第二课 集团毛利率下滑的原因

【案例背景】 在本期分析案例中,您将扮演一个大型商品零售集团的数据分析师,应对经理交给你的任务——发现集团毛利率下滑的原因,并给出建议; 随着您一步一步的探索分析,您将通过对商品和订单的相关历史数据的分析,逐步找出影响毛利率的关键要素,并给出相应的分析结论,…

静态误差分析

分类 随机误差、系统误差、粗大误差。 随机误差: 大部分随机误差满足正态分布,具有对称性、单峰性、有界性、抵偿性。 对称性:绝对值相等的正负误差出现的次数相等。 单峰性:绝对值越小的误差出现次数越多。 有界性&#xff1…

GIS在地质灾害危险性评估与灾后重建中的实践

第一章 基本概念与平台介绍 1、基本概念 地质灾害类型 地质灾害发育特征与分布规律 地质灾害危害特征 地质灾害孕灾地质条件分析 地质灾害诱发因素与形成机理 ​ 2、GIS原理与ArcGIS平台介绍 GIS简介 ArcGIS基础 空间数据采集与组织 空间参考 空间数据的转换与处理 …

ReID专栏(三) 注意力的应用

前言 本文中提出了一种用于行人重识别的注意感知特征学习方法。该方法由一个部分注意分支(PAB)和一个整体注意分支(HAB)组成,并与基础再识别特征提取器进行了联合优化。由于这两个分支建立在主干网络上,因此…

NumPy 数值计算基础

NumPy 数值计算基础 Numpy简介Numpy创建数组对象第一种:利用array函数创建ndarray数组第二种:利用arange函数:创建等差一维数组第三种:利用linspace函数:创建等差一维数组,接收元素数量作为参数。第三种:利用linspace函数:创建等差━维数组,接收元素数量…

剑指 Offer 18. 删除链表的节点解题思路

文章目录 题目解题思路 题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二…

Windows程序设计 学习笔记 第九章 子窗口控件

目录: 文章目录 一,按钮类1.创建子窗口拓展1——获取对话框字符尺寸的方法拓展2——获取实例句柄的方法2.子窗口传递消息给父窗口3.父窗口传递信息给子窗口拓展3 窗口句柄与ID 的相互获取① 已知窗口句柄 获取 ID②已知子窗口ID 获取 子窗口句柄 4. 按钮…

仙境传说RO怎样创建一个NPC rAthena脚本语言的hello word

仙境传说RO怎样创建一个NPC rAthena脚本语言的hello word 大家好,我是艾西。上一篇文章中我们有教大家怎么编译仙境传说RO服务端和客户端,当我们自己可以搭建架设游戏时,那么这个游戏在某种意义上就是我们说的算了。比如增加一些特色功能等&…

数据隐私为先:EMQX Cloud BYOC 架构解析

随着物联网的飞速发展,保护数据隐私和安全变得愈发重要。构建一个安全、可靠、可扩展的物联网基础设施成为企业的首要任务。 EMQ 近期推出了 EMQX Cloud BYOC,采用了以数据隐私为先的架构,为解决这些问题提供了一个理想的方案。用户可以在自…

JavaEE-Servlet的使用

目录 显示 HttpServletRequest 的常用属性获取GET请求中的query string 的内容获取 POST 请求中 body 的内容实现自动刷新构造重定向页面 显示 HttpServletRequest 的常用属性 能够返回一个页面, 显示以下内容: URL方法版本号query stringcontext path所有的 header import …

Shell脚本攻略:通配符、正则表达式

目录 一、理论 1.通配符 2.正则表达式 二、实验 1.通配符 2.正则表达式 一、理论 1.通配符 (1)概念 通配符只用于匹配文件名、目录名等,不能用于匹配文件内容,而且是已存在的文件或者目录。 各个版本的shell都有通配符&…

MySQL遇到的问题

注意:当前遇到问题都是MySQL5.7.33版本和Windows10的系统,MySQL服务的名称是MySQL57,以下出现的MySQL57只是我的MySQL服务名称,要根据自己的MySQL服务的名称来 可以通过“服务”,找到自己的MySQL服务名称,…

SpringBoot测试——高级配置

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ SpringBoot测试——高级配置 一、SpringBoot加…

电容器基础原理知识

电容器基础知识 电容器是一种储能元件,在电路中用于调谐、滤波、耦合、旁路、能量转换和延时。电容器通常叫做电容。按其结构可分为固定电容器、半可变电容器、可变电容器三种。 常用电容的结构和特点 常用的电容器按其介质材料可分为电解电容器、云母电容器、瓷介…

什么是RabbitMQ?

RabbitMQ是一个由erlang开发的消息队列。消息队列用于应用间的异步协作。 2.RabbitMQ的组件 Message:由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key、priority、delivery-mode&#xff…

ChatGPT与软件架构(2) - 基于Obsidian和GPT实现解决方案架构自动化

磨刀不误砍柴工,良好的工具可以有效提高效率。本文介绍基于Obsidian和GPT打造架构知识库的思路,为架构师提供整理、分享、原文: Solution Architecture Automation With Obsidian and GPT Stas Parechyn Unsplash 本文介绍的ArchVault是一个旨在帮助架构…

【100个 Unity实用技能】 | Unity 的 LOD技术(多细节层次)

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

vue3+ts+echarts5基本地图下钻~

依靠本地json文件实现省市下钻&#xff0c;有后台的可以改成服务&#xff0c;样式没有&#xff0c;vue3tsecharts5&#xff0c;一定要设宽高 html&#xff1a; <div click"back">返回</div> <div id"echartsMap" style"width: 58%; h…

【Azure】微软 Azure 基础解析(七)Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx…

入职字节跳动那一天,我哭了(蘑菇街被裁,奋战7个月拿下offer)

前言 先说一下自己的个人情况&#xff0c;20届应届生&#xff0c;通过校招进入到了蘑菇街&#xff0c;然后一待就待了差不多2年多的时间&#xff0c;可惜的是去年8月份受疫情影响遇到了大裁员&#xff0c;而我也是其中一员。好在之前一直想去字节跳动&#xff0c;年尾就已经在…