完整电商项目--(十一)后台管理项目(drf)(1):CORS跨域与JWT

一、drf_admin(权限RBAC)后台管理系统(架构解析篇) 本文深入解析了基于Django和DRF框架的drf_admin后台管理系统架构,重点介绍了其RBAC权限控制、前后端分离设计及模块化开发策略。系统通过JWT认证、统一API规范和分层架构实现高效开发,适用于企业级应用场景,特别适合需要精细权限管理的项目。 阅读详情

跨域CORS(跨域资源共享)

背景

  • 我们采用设计 后台管理系统,使用 django drf框架实现。并且前后端有两个不同的端口。
  • 前端和后端是 不同的域名,涉及到跨域访问数据的问题,因为浏览器的同源策略,默认是不支持两个不同域间相互访问数据,此时为解决这个问题,就需要在后端添加跨域访问的支持。

解决方案

  • options询问请求。这个就是用来判断是否 允许跨域访问数据的。 例如我们登录后台管理
    在这里插入图片描述
# 登陆操作时的请求

INFO basehttp 124 "OPTIONS /meiduo_admin/authorizations/ HTTP/1.1" 200 0
INFO basehttp 124 "POST /meiduo_admin/authorizations/ HTTP/1.1" 200 227

# 1.从pip安装:
python -m pip install django-cors-headers

# 2.然后将其添加到已安装的应用程序中:确保添加结尾逗号,否则可能会收到一个逗号ModuleNotFoundError
INSTALLED_APPS  = [
    ...
    ' corsheaders ',
    ...
]

# 3.您还需要添加一个中间件类来侦听响应:

MIDDLEWARE  = [
    ...
    的corsheaders。中间件。CorsMiddleware ',
     'django.middleware.common.CommonMiddleware',
    ...
CorsMiddleware应该放置在尽可能高的位置,尤其是在任何可以生成响应的中间件之前,例如Django CommonMiddleware或Whitenoise WhiteNoiseMiddleware。如果不是以前,它将无法将CORS标头添加到这些响应中。

另外,如果您正在使用CORS_REPLACE_HTTPS_REFERER它,则应将其放置在Django之前CsrfViewMiddleware(请参见下文)。

根据中间价你执行顺序,直接放到第一个位置就可以了~
]

关于允许访问白名单:CORS_ALLOWED_ORIGINS

授权进行跨站点HTTP请求的来源列表。默认为[]。

Origin由CORS RFC第3.2节定义 为URI方案+主机名+端口,或特殊值“ null”或“ file://”之一。默认端口(HTTPS = 443,HTTP = 80)在此处是可选的。

浏览器在“隐私敏感的上下文”中(例如,当客户端从file://域中运行时)发送特殊值null 。根据此bug,特殊值file://是由Android上的某些版本的Chrome意外发送的。

例:

CORS_ALLOWED_ORIGINS  = [
     “ https://example.com”,
     “ https://sub.example.com”,
     “ http:// localhost:8080”,
     “ http://127.0.0.1:9000” 
]
以前,此设置称为CORS_ORIGIN_WHITELIST,仍然可以用作别名,新名称优先。

允许互相访问cookie:CORS_ALLOW_CREDENTIALS

如果为True,则将允许将cookie包含在跨站点HTTP请求中。默认为False。

注意:在Django 2.1中,添加了SESSION_COOKIE_SAMESITE设置,'Lax'默认情况下设置为 ,这将防止Django的会话cookie跨域发送。更改它以None绕过此安全限制

token机制

想了解session机制的,可以看看我之前的文章

  • token机制是为了解决 session中暴露的一些缺点而学习的,所以可以先阅读前文

流程

1. 生成token

  • 进入登录页面,前端将用户输入的 账号和密码等信息传递到后端
  • 后验证通过之后, 如图片中,将用户数据进行加密(生成所谓的token),但是后端并不保存该数据!(和session的区别),而是将该 token字符串返回给前端

2. 前端存储token字符串

  • 前端在接收到后端返回的token数据之后,会进行存储。有两个存储空间。 一个是Local Storage,一个是Session Storage
    在这里插入图片描述
  • 前端可以通过js代码,将token信息,保存到Local Storage当中,也可以提取它。如下
    在这里插入图片描述
    在这里插入图片描述

3.将token携带再请求当中,交由后端验证

  • 前端发送请求的时候,带上这个token,发送给后端
  • 后端解密前端发送过来的 token。 对其进行判断
  • 整个过程中后端并不存储任何信息,而是有一套加密解密的方法,保证数据不被篡改,正确验证。并且节约服务器资源。
  • 也可以加密的过程中设置 加密的有效期,用来判断数据是否过期(解决 保存登录状态带时效的问题,比如登录之后七天内可以不用登陆,进入网站自动登录)。

注意

  • (1)当token 保存到 Storage中后,浏览器发送请求时想要携带这个token数据,只能通过js代码,读取到之后携带传递给后端。并不是向cookie一样(sessionid),发送任何请求都会携带。

  • (2)不同网站之间保存的数据 是不能用js代码 访问彼此的数据的!也就是说,当前的token,是保存在当前的域名下的存储空间里的(如上面图片例子),只能通过当前的js进行操作。

  • 当前的js代码也是在同个域名下的
    在这里插入图片描述

  • (3)上面的这种操作,保证了其他网站不能获取当前域名下的数据内容。(防止了其他网站 伪造了一段js代码,企图访问本网站下的数据,基于域名安全,只有该域名下的js代码才可以访问)。也就是说 资源存储域名(js,css啥的通俗讲),数据存储域名 是一致的。

  • (4) 同样是 有一套加密解密的方法,所以 任何服务器都能对 token数据进行验证,这就解决的 服务器拓展的问题

以上所述,就是解决了session机制的三个缺点:占用服务器端资源空间(存储session数据),csrf攻击(cookie只要发送请求就会携带,容易泄露信息),集群搭建的问题(拓展服务器)

JWT(Json Web Token) 基于token的鉴权机制

基本流程

  • 用户使用用户名密码来请求服务器
  • 服务器进行验证用户的信息
  • 服务器通过验证发送给用户一个token
  • 客户端存储token,并在每次请求时附送上这个token值
  • 服务端验证token值,并返回数据

jwt的基本构成

  • 完整:
# JWT 加密后的随机字符串

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
  • 通过 . 将其分为三部分

(1)header

  • jwt的头部承载两部分信息:
    • 声明类型,这里是jwt
    • 声明加密的算法 通常直接使用 HMAC SHA256
      完整的头部信息类似这样:
{
  'typ': 'JWT',
  'alg': 'HS256'
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

payload

  • 载荷就是存放有效信息的地方,这些有效信息包含三个部分

    • 标准中注册的声明
    • 公共的声明
    • 私有的声明
  • 标准中注册的声明 (建议但不强制使用) :

    iss: jwt签发者
    sub: jwt所面向的用户
    aud: 接收jwt的一方
    exp: jwt的过期时间,这个过期时间必须要大于签发时间
    nbf: 定义在什么时间之前,该jwt都是不可用的.
    iat: jwt的签发时间
    jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

  • 公共的声明
    公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

  • 私有的声明 :
    私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息

定义一个 payload:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

signature

  • JWT的第三部分是一个签证信息,这个签证信息由三部分组成:

    • header (base64后的)
    • payload (base64后的)
    • secret
      这个部分需要base64加密后的header和base64加密后的payload使用 . 连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
signature作用
  • 数据安全的保证,防止别人修改数据,因为前两部分数据都是常规加密很容易破解后修改,但是 signature签证信息的作用就体现出来了,第三部分只要 知道私钥后才可能被破解,只要你前两段信息和我的 签证信息不同,我就不承认,不给你验验通过,另外通过 signature的 解密设置时间,可以实现 一段时间的 登录状态保持。 解密失败,可能是因为过期,就导致失去登录状态。

加密介绍

  • (1) 首先要具有一套 加密算法
  • (2) 需要有加密数据
  • (3) 加密秘钥:保证数据的安全,没有这个秘钥 ,就不能进行解密操作。 类似之前QQ登录中讲过的 itsdangerous,也是需要秘钥。

好了,就先介绍到这里,这些就是基本的信息,下节介绍怎么在 drf中使用这个 jwt
over!

大一python期末考试试题 大家好,本文将围绕大一python上机题库及答案展开说明,大一python期末选择题是一个很多人都想弄明白的事情,想搞清楚大一python期末简答题需要先了解以下几个事情。Python基础学完了再学什么? 阅读详情

相关推荐

Python基础学完了再学什么呢?

Python基础学完了再学什么? 基础阶段学完Python 基础语法、python 容器、函数和文件操作、面向对象、 python编程和web基础、Linux 操作系统多任务编程、Python 网络编程、静态 web 服务器、HTML、CSS、JavaScript、数据库MYSQL、正则表达式、Python 进阶、mini-web 框架后,需要在进行实操积累项目实战经验。 python学万基础阶段接下来就是项目学习了,具体的内容如下: 一、web-Django框架与项目 1、Django框架.

bug中的极品!!!专治BUG 1620

同源策略与CORS(跨源资源共享)以及django项目支持CORS

文章目录一、同源策略/SOP(Same origin policy)1.1 源(origin)的定义1.2 同源的含义1.3 同源策略二、CORS(跨源资源共享)2.1 预检请求2.2 请求分类2.3 简单请求2.4 非简单请求三、使Django项目支持CORS3.1 自定义中间件3.2 使用django-cors-headers3.2.1 安装3.2.2 配置 一、同源策略/SOP(Same origin policy) 1.1 源(origin)的定义 以下三个部分共同构成了一个源: 协议:如htt

花城的博客 3996

在线点餐系统毕业设计实践:微信小程序与Django后端开发全解析

Web开发与移动端技术的融合正在改变传统餐饮行业的服务模式。在软件开发领域,前后端分离架构已成为主流,前端通过微信小程序提供轻量级交互体验,后端则借助Django框架快速构建稳定的业务逻辑。微信小程序凭借其开发成本低、生态成熟、分发便利等优势,成为校园项目与中小企业原型验证的热门选择;而Django自带Admin后台和ORM机制,能大幅提升API开发效率。从用户登录、菜品浏览到购物车与订单流转,系统设计需兼顾数据一致性、事务处理和接口安全。JWT认证机制保障了用户身份的可靠性,车辆状态与价格快照的设计则体现

weixin_34354173的博客 343

最新django-cors-headers配置项简述

配置 根据2022-2-12的readme.rst文档书写 在Django设置中配置中间件的行为。必须设置以下三种设置中的至少一种: CORS_ALLOWED_ORIGINS CORS_ALLOWED_ORIGIN_REGEXE CORS_ALLOW_ALL_ORIGINS CORS_ALLOWED_ORIGINS: Sequence[str] 允许的来源,默认为[] CORS_ALLOWED_ORIGINS = [ "https://example.com", "https://sub

mydirector的专栏 1273

C# 【WebService编写调用】

😹 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

只有登上山顶,才能看到那边的风光 1173

汉字跨越三千年的生命力与数字时代适应性

文字作为文明载体,其演变规律始终遵循实用性与适应性的平衡。汉字作为现存最古老的文字系统,凭借形义结合的六书构造原理,实现了超方言的文化统一功能。在计算机处理方面,五笔输入法与Unicode支持证明了其技术兼容性,而视觉识别效率的先天优势使其在信息时代更具传播效力。从甲骨文识别AI到现代书法设计,汉字系统持续展现强大的文化承载力与技术适应性,这种活态传承为数字人文研究提供了独特样本。

weixin_29058331的博客 352

DRF三个配置项allow_hosts、cors_allowed_origins、CSRF_TRUSTED_ORIGINS

DRF三个配置项

weixin_58414392的博客 1819

Kylin V10 ARM64离线安装ffmpeg实战指南

在国产化替代浪潮下,基于银河麒麟V10和ARM架构(如飞腾、鲲鹏)的内网服务器部署音视频处理服务成为常态。由于系统默认软件源缺乏aarch64包且无法连接外网,常规yum安装方式难以奏效。本文从离线安装的通用概念出发,剖析了在Kylin V10上安装ffmpeg的三大路线及其原理,重点介绍了源码编译法,包括依赖梳理、工具链准备、编译参数配置、常见错误排查等关键环节。同时,将这套依赖管理与离线部署方法论延伸至nginx、node.js、Python库及docker等场景,帮助读者建立一套可复用的国产化系统离线

weixin_33417488的博客 147

【Django网络安全】如何正确设置跨域

我辈李想:文章原创,转载时请务必加上、作者信息和本声明。

黎明总是如期而至 5689

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3867

从轻量化到高精度:3DXML 转 STP 的工程数据升级技术指南

本文详细解析了3DXML转STP格式的工程数据升级技术,对比了两种格式在轻量化和高精度方面的特性差异,并提供了CATIA、FreeCAD及Python编程等多种专业级转换方案。通过实际案例展示了如何确保转换过程中的数据精度,适用于CAD设计、精密制造等场景,帮助工程师实现工程数据的高效升级。

weixin_29201859的博客 215

解决Django 前后端分离跨域问题

一、跨域出现原因 浏览器的同源策略:同源策略是一种浏览器最基本的安全机制,如果两个 URL 的 protocol、port(如果有指定的话)和 host都相同的话,则这两个 URL 是同源。 二、解决方案 (一)CORS:使用django-cors-headers包 支持Python 3.6至3.9。 支持Django 2.2到3.2。 1、从pip安装: pip install django-cors-headers 2、修改settings.py: 注册App INSTALLE..

Snippers的博客 1478

【云原生技术】云计算与网络:容器服务(Tencent Kubernetes Engine,简称TKE)简介

基本概念主要特点应用场景技术实现容器服务(Tencent Kubernetes Engine,简称TKE)是腾讯云提供的一种托管的容器管理服务,基于开源的Kubernetes系统。TKE旨在简化容器的部署、管理和扩展,并且提供高性能、可靠性和安全性,适用于各种规模的企业和应用。

weixin_46453070的博客 2041

从零搭建电商网站:Django全栈开发实战

用Django 4.2版本创建项目时,我特意采用了前后端分离的架构。不用自己折腾Nginx和uWSGI配置,数据库也自动配好了,特别适合快速演示。特别要注意的是模型之间的关系设计,比如商品和分类是多对多,订单和订单项是一对多。的部署能力,省去了很多运维工作,可以更专注于业务逻辑开发。这个项目从零开始到上线用了两周时间,Django的开发效率确实高。特别处理了购物车和订单的复杂业务逻辑,比如下单时要同时更新库存。用了些jQuery处理交互,但核心逻辑还是用原生JS实现。Payment:支付记录(模拟)

IndigoNight21的博客 1005

Halcon 色彩标定:RGB空间下实现白平衡与CCM矩阵合成静态HDR图像

摘要 本文介绍了一种基于Halcon的色彩校正方法,结合白平衡与灰轴约束最小二乘法实现精准颜色还原。方法分为三步:1)自动定位色卡区域并提取灰阶块计算白平衡增益;2)通过前三列色块建立测量值与标准值的映射关系;3)引入灰轴约束条件求解色彩校正矩阵(CCM),确保中性灰区域不偏色。算法采用中位数计算白平衡增益以提高鲁棒性,并通过旋转校正处理色卡倾斜问题。实验表明,该方法能有效消除相机采集的系统色偏,适用于颜色测量、表面检测等机器视觉场景。文末提供了完整代码实现。

LIN943168247的博客 404

基于遗传算法的码头泊位分配调度优化问题求解

例如,基因型为 [3, 1, 4, 2] 表示第一艘停靠在第三个泊位,第二艘停靠在第一个泊位,以此类推。同时,该码头有 n 艘船需要停靠,每艘船的货物数量、船长、船宽都不同,需要根据其特性来分配合适的泊位,并确定每个泊位的使用时间,以最大化码头的使用效率。码头的泊位分配调度是一个关键的物流问题,它涉及到船舶的进出港、货物的装卸和存储等多个方面,因此对其进行优化是至关重要的。根据得到的最优个体,可以得到每个泊位停靠的船只、使用时间等信息,从而确定码头的泊位分配调度方案。% 不同船只的货物数量。

uote_e的博客 1075

基于Django的图书管理系统全栈实战:从源码运行到业务扩展

在Web开发领域,CRUD(增删改查)操作是构建应用的基础,它涉及对数据库数据的创建、读取、更新与删除。其原理是通过后端框架(如Django、SpringBoot)建立数据模型,并经由视图或控制器处理HTTP请求,从而操作数据库。掌握CRUD对于理解业务逻辑实现至关重要,是开发信息管理系统的核心技能。在实践层面,前后端分离架构已成为主流,后端通过RESTful API提供数据服务,前端(网页、小程序、APP)则负责交互展示,这种模式提升了系统的可维护性与多端适配能力。学生图书管理系统作为一个经典的练手项目,

weixin_33726318的博客 449

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python创意小作品母亲节,python创意小作品中学生

大家好,小编为大家解答python创意小作品制作方法和步骤的问题。很多人还不知道python创意小作品100行代码左右,现在让我们一起来看看吧!Python基础学完了再学什么?

2401_85422942的博客 1114

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Python基础学完了再学什么?

Python基础学完了再学什么? 基础阶段学完Python 基础语法、python 容器、函数和文件操作、面向对象、 python编程和web基础、Linux 操作系统多任务编程、Python 网络编程、静态 web 服务器、HTML、CSS、JavaScript、数据库MySQL、正则表达式、Python 进阶、mini-web 框架后,需要在进行实操积累项目实战经验。

Python栈 818

python学到什么程度算入门,python从入门到精通好吗

大家好,小编来为大家解答以下问题,python学到什么程度算入门,python从入门到精通好吗,现在让我们一起来看看吧!Python基础学完了再学什么?基础阶段学完Python 基础语法、python 容器、函数和文件操作、面向对象、 python编程和web基础、Linux 操作系统多任务编程、Python 网络编程、静态 web 服务器、HTML、CSS、JavaScript、数据库MySQL、正则表达式、Python 进阶、mini-web 框架后,需要在进行实操积累项目实战经验。

2401_84666942的博客 350

Python基础学完了之后陷入迷茫?今天这篇文章让你明白基础学完该学的内容

Python基础学完了再学什么?基础阶段学完Python 基础语法、python 容器、函数和文件操作、面向对象、 python编程和web基础、Linux 操作系统多任务编程、Python 网络编程、静态 web 服务器、HTML、CSS、JavaScript、数据库MySQL、正则表达式、Python 进阶、mini-web 框架后,需要在进行实操积累项目实战经验。

pythonhy的博客 1922
上一篇: 完整电商项目--(十)性能优化(1): 首页静态化
下一篇: 完整电商项目--(十一)后台管理项目(drf)(2):django-rest-framework-simplejwt实现登录功能
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值