静态文件鉴权

静态文件鉴权的解决方案

背景介绍

XX业务系统作为BXX业务系统的孪生姐妹系统,是对BXX受理业务的强力补充系统,他允许操作员拿着IPAD,和客户约定地点上门受理业务。

因一些业务的受理,按照最新的业务规章制度,需要客户观看XX视频方可受理,我们现阶段,视频文件的URL是直接暴露在公网上,通过URL是可以直接浏览相关的视频文件,由此引申出了静态文件鉴权的需求。

客户需求

接到XX客户的需求,他们要求暴露在互联网公网的视频的URL,不能在浏览器中直接输入地址访问,因为视频内容属于较敏感的内容,需要保护,要求增加操作员登录认证机制。

解决方案

一、response输出流

拿到需求,我首先想到的就是通过response.getOutputStream().write输出文件流的方式来解决此问题,但是立马被组内前端人员否决掉,此方案会影响前端体验。在体验为王的时代,此方案确实不妥,后端Java接口,首先需要从文件服务器获取相应的文件,然后再通过response写流的方式输出,此方案会有一个文件服务器获取步骤,对比公网直接访问,相关于多了一次文件流的流转动作,这样就会造成前端的卡顿感,并且文件预览的功能,估计也拜拜了。此方案——NO PASS!

二、静态文件鉴权

在我的认知中,我绝对不会是第一个有这需求的人,世界这么大,我要去问问。于是,“静态文件鉴权”六个字在我脑海中浮现,我毫不犹豫在百度的搜索框中输入这六个大字,相关解决方案的文章尽在眼底,通过相关知识的消化、吸收、本地Demo的模拟、开发环境的测试,最终验证了静态文件鉴权的可行性。最终的结果,虽然看似简单,几行代码,几行配置就解决了相关问题,但是其中还是走了不少弯路,好在消化吸收总结了。

三、OpenResty解决方案

OpenResty是一个基于Nginx与Lua的高性能Web平台,相当于二次封装了nginx,并且集成了lua脚本,开发人员只需要简单的编写lua的脚本,就可以实现静态文件鉴权的相关的逻辑了。

百度下载

  1. openresty-1.21.4.3-win64.zip——主程序
  2. lua-resty-http-master.zip——让lua脚本支持http发包

解压openresty本地目录,发现此软件真的就是在nginx上包了一层,替换ngnix成本极小。 启动命令,配置文件,都与ngnix一模一样。

解压lua-resty-http,将\lib\resty\目录下http*.lua的三个文件copy至openresty\lualib\resty\目录下,即可让lua脚本支持http发包。

修改配置nginx.conf,在server中增加相应的location,我这里映射了所有mp4结尾的请求

Lua脚本:

可以看到脚本非常简单,Lua中..是连接字符串的意思。

Controller:

我这里仅仅是为了验证可行性,所以就写死了判断,这里的返回值内容,会在Lua脚本中用到。

访问成功效果:

可以看到url中,带了?token=123456,视频正常播放。

访问失败效果:

我输入错误的token,或者不输入token,静态文件的访问被拦截了。

通过上面的模拟,此方案已经可以满足客户的需求了。

四、ngnix解决方案

当我将OpenResty解决方案向领导汇报时,立马被泼了一盆冷水,理由很简单,客户不会轻易同意替换ngnix,不可控的风险太大,日后出现问题的维护成本太高。虽然我据理力争,终究是未站在客户的角度考虑问题,所以我也只能接受领导的建议,寻找ngnix的解决方案。

Ngnix也能支持Lua脚本,但是需要重新编译才能支持Lua脚本。默认情况下,Nginx并不直接支持Lua脚本。要使其支持Lua脚本,需要进行一些额外的配置和编译步骤。对我来说,研究重新编译Ngnix的成本与风险,还真不如直接使用OpenResty,所以Ngnix支持Lua脚本的方案也被我自己否决了。

最后,绞尽脑汁,在百度,ChatGpt的帮助下,ngnix经过无数次的改配置,启动与重启中,终于在不依赖Lua脚本的前提下,也有了对应的解决方案。

修改ngnix.conf配置文件 :

token传参这里,卡了好久,经过反复试验,终于往header中增加url路径的方式测试成功,后端成功取到参数。

X-Original-URI是一个非标准的HTTP报文头,其作用是使用该报文头的值中所指定的URL覆盖请求目标中的URL。该报文头通常在代理服务器或负载均衡器中使用,用于记录原始请求的URL,以便在后续的处理中能够获取到原始的请求信息。然而,由于该报文头并非标准的HTTP报文头,因此不是所有的代理服务器或负载均衡器都支持该报文头。好在ngnix支持了该报文头。

Java后端改造:

注意取到的X-Original-URI的内容,取到的内容,需要拆分字符串,提取token,我这里简单验证可行性,就没这些逻辑,简单判断下是否相等即可。Ngnix验证token失败,HTTP的响应码需要不为200,所以我这里抛出了异常。

访问成功效果:

访问失败效果:

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

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

相关文章

常用 API 异常

常用 API & 异常 对之前那篇 API 文章的补充学习 1.API 1.1 API概述【理解】 什么是API ​ API (Application Programming Interface) :应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来&am…

OpenCV快速入门:窗口交互

文章目录 前言一、鼠标操作1.1 鼠标操作简介1.2 鼠标事件类型(event类型)1.3 鼠标事件标志(flags)1.4 代码示例1.4.1 获取鼠标坐标位置1.4.2 监听鼠标滚轮事件1.4.3 在图像中显示鼠标坐标 二、键盘操作2.1 代码示例2.2 waitKey的等…

ssm家长乐山美食网站系统

1.需求分析\n将进行家乡乐山美食网站的需求分析。需求分析是系统开发过程中的一项重要工作,它是对用户需求进行深入研究和分析,明确系统的功能、性能、界面等方面的需求,为后续的设计和开发提供依据。\n首先,需要明确该网站的主要…

制作Go程序的Docker容器(以及容器和主机的网络问题)

今天突然遇到需要将 Go 程序制作成 Docker 的需求,所以进行了一些研究。方法很简单,但是官方文档和教程有些需要注意的地方,所以写本文进行记录。 源程序 首先介绍一下示例程序,示例程序是一个 HTTP 服务器,会显示si…

【GUI】-- 11 贪吃蛇小游戏之绘制静态的小蛇

GUI编程 04 贪吃蛇小游戏 4.2 第二步:绘制静态的小蛇 现在绘制静态的小蛇(即小蛇初始位置),并且完善游戏默认初始状态。这一步还在GamePanel类中实现。 首先,定义了小蛇的数据结构, //定义蛇的数据结构int length; //小蛇总长…

yolo系列模型训练数据集全流程制作方法(附数据增强代码)

yolo系列的模型在目标检测领域里面受众非常广,也十分流行,但是在使用yolo进行目标检测训练的时候,往往要将VOC格式的数据集转化为yolo专属的数据集,而yolo的训练数据集制作方法呢,最常见的也是有两种,下面我…

开源与闭源:大模型发展的双重走向

目录 前言开源和闭源的优劣势比较开源的优势闭源的优势 开源和闭源对大模型技术发展的影响对技术发展的影响对数据共享的影响对业务拓展的影响 开源与闭源的商业模式比较开源的商业模式闭源的商业模式 处在大模型洪流中,向何处去?结语 前言 随着人工智能…

中国智能音箱市场销量下降,百度稳居第一 /中国即评出10个大模型创新案例 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 中国智能音箱市场销量下降,百度稳居第一 中国即将评选出10个最具代表性的大模型创新案例…

【Typroa使用】Typroa+PicGo-Core(command line)+gitee免费图片上传配置

TyproaPicGo-Core(command line)gitee免费图片上传配置 本文是在win10系统下配置typroapicGo-Core(command line)gitee图片上传的教程。需要的环境和工具有: gitee账号,新建仓库及token令牌;已经安装了的typroa,需要0.9.98版本以上…

2023最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念,覆盖面非常广泛,包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等,性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称,它其实包…

大数据Doris(二十五):Stream Load数据导入演示和其他导入案例

文章目录 数据导入演示和其他导入案例 一、数据导入演示

【Web】Ctfshow SSRF刷题记录1

核心代码解读 <?php $url$_POST[url]; $chcurl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultcurl_exec($ch); curl_close($ch); ?> curl_init()&#xff1a;初始curl会话 curl_setopt()&#xff1a;会…

水质测定仪的优势特点有哪些?

水质测定仪&#xff1a;水环境保护的得力助手 随着人们环保意识的不断提高&#xff0c;水质问题逐渐引起了大家的关注。为了保护水环境&#xff0c;必须加强对污水排放的监测&#xff0c;而水质测定仪在这个过程中扮演着重要的角色。 水质测定仪是一种专业的仪表&#xff0c;主…

旋极携手西班牙SoC-e公司,为中国客户提供高效可靠TSN通讯解决方案

2023年2月&#xff0c;旋极信息与西班牙SoC-e公司正式签订战略合作协议&#xff0c;成为其在中国区重要合作伙伴。 SoC-e是一家世界领先的基于FPGA技术的以太网通讯解决方案供应商&#xff0c;是一系列IP核开发领域的先锋&#xff0c;为关键任务实施网络化、同步性和安全性提供…

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…

【23真题】超难985!做完感觉没学过!

本套试卷难度分析&#xff1a;22年西北工业大学827考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题内容有难度&#xff0c;题目考察全为大题&#xff0c;题目不多&#xff01;但是题目都很新颖&#xff0c;状态方程的题目考察较…

CMSIS-RTOS在stm32使用

目录&#xff1a; 一、安装和配置CMSIS_RTOS.1.打开KEIL工程&#xff0c;点击MANAGE RUN-TIME Environment图标。2.勾选CMSIS CORE和RTX.3.配置RTOS 时钟频率、任务栈大小和数量&#xff0c; 软件定时器. 二、CMSIS_RTOS内核启动和创建线程。1.包含头文件。2.内核初始化和启动。…

【开源】基于JAVA的快递管理系统

项目编号&#xff1a; S 007 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S007&#xff0c;文末获取源码。} 项目编号&#xff1a;S007&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…

devops底层是怎么实现的

DevOps的3大核心基础架构 简而言之&#xff0c;实现DevOps工具链&#xff0c;基本需要3个核心基础架构&#xff1a; SCM配置管理系统 Automation自动化系统 Cloud云&#xff08;或者说可伸缩的、自服务的、虚拟化系统&#xff09; SCM配置管理系统 SCM中所放置的内容又可以再…