OpenResty(nginx+lua+resty-http)实现访问鉴权

OpenResty(nginx+lua+resty-http)实现访问鉴权

最近用BI框架解决了一些报表需求并生成了公开链接,现在CMS开发人员打算将其嵌入到业务系统中,结果发现公开链接一旦泄露任何人都可以访问,需要实现BI系统报表与业务系统同步的权限控制。但是目前使用的BI框架并不支持这样的功能,如果自己修改BI系统去实现这样的功能开发成本太高。

基于这样的背景下,我想到了使用Nginx网关来实现目标页面的鉴权。结果发现了OpenResty,下面我将实操过程分享给大家。这次使用了PowerBI和其他BI系统,所测试的服务器为Windows Server系统。其他系统的具体操作细节会有所区别,下面我只以Windows系统为例进行演示。

OpenResty 简介与安装

OpenResty 是一个基于 Nginx 和 LuaJIT 的动态 web 平台。它通过在 Nginx 中集成 LuaJIT,允许在 Nginx 服务器上运行 Lua 脚本,增加了 Nginx 的灵活性和可扩展性。

官网下载页:http://openresty.org/en/download.html

首先下载openresty-1.21.4.3-win64.zip 并解压

原版Nginx带有nginx-service.exe可以很方便的将Nginx注册为系统服务。

下面我复制原版Nginx中的nginx-service.exenginx-service.xml文件 到 新解压的 E:\soft\openresty-1.21.4.3-win64目录中。

若以前的Nginx已经注册服务可以使用以下命令先取消注册:

nginx-service.exe uninstall nginx

然后修改nginx-service.xml文件为如下内容:

<service><!-- 服务名 --><id>nginx</id><!-- 显示名称 --><name>Nginx Service</name><!-- 描述 --><description>High Performance Nginx Service</description><logpath>E:\soft\openresty-1.21.4.3-win64\logs</logpath><log mode="roll-by-size"><sizeThreshold>10240</sizeThreshold><keepFiles>8</keepFiles></log><executable>E:\soft\openresty-1.21.4.3-win64\nginx.exe</executable><startarguments>-p E:\soft\openresty-1.21.4.3-win64</startarguments><stopexecutable>E:\soft\openresty-1.21.4.3-win64\nginx.exe</stopexecutable><stoparguments>-p E:\soft\openresty-1.21.4.3-win64 -s stop</stoparguments>
</service>

然后执行即可将新安装的OpenResty 的Nginx注册为服务:

nginx-service.exe install nginx

可以将上述过程用bat脚本自动化,首先创建文件nginx-service-template.xml,内容如下:

<service><id>nginx</id><name>Nginx Service</name><description>High Performance Nginx Service</description><logpath>{{dir}}\logs</logpath><log mode="roll-by-size"><sizeThreshold>10240</sizeThreshold><keepFiles>8</keepFiles></log><executable>{{dir}}\nginx.exe</executable><startarguments>-p {{dir}}</startarguments><stopexecutable>{{dir}}\nginx.exe</stopexecutable><stoparguments>-p {{dir}} -s stop</stoparguments>
</service>

然后创建bat脚本安装nginx服务.bat

@echo off
setlocal enabledelayedexpansionset "path=%~dp0"
set "path=%path:~0,-1%"
>"nginx-service.xml" (for /f "delims=" %%i in ('type "nginx-service-template.xml"') do (set "line=%%i"set "line=!line:{{dir}}=%path%!"echo(!line!)
)
nginx-service.exe uninstall nginx
nginx-service.exe install nginxecho "Install complate"
pause

然后执行命令即可一键安装新的Nginx服务:

更新nginx服务.bat

注意:以上脚本都在openresty-1.21.4.3-win64的安装目录下,一键生成配置并安装服务。

resty.http的安装

我们的鉴权脚本需要http请求目标服务,但是resty.http并未集成到openresty中,所以需要我们自行下载。

下载地址为:https://github.com/ledgetech/lua-resty-http

将lib/resty目录下的三个lua脚本复制到openresty-1.21.4.3-win64\lualib\resty目录中。

image-20231204210209325

这样我们就满足在lua脚本中发起http请求的基本条件。

lua鉴权脚本编写

首先我们实现一个基本的鉴权脚本:

local token = ngx.var.arg_token
if not token thenngx.exit(400)
end
if token ~= "123" thenngx.exit(401)
end

上述脚本获取get请求的token参数,判断值是否为123,不是123则鉴权不通过返回401。

下面我们为了实现与业务系统的权限一致,需要询问业务系统传入的token是否有效,这时就需要使用resty.http

local token = ngx.var.arg_token
if not token thenngx.exit(400)
end
local http = require "resty.http"
local httpc = http.new()
local url = "https://业务系统提供的接口地址?token="..token
local res, err = httpc:request_uri(url, {method = "GET",headers = {["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36",},ssl_verify = false
})
if not res thenngx.exit(402)
end
if res.body ~= "success" thenngx.exit(403)
end

以上脚本根据业务系统是否返回success,决定鉴权是否通过。

请求中使用ssl_verify = false是因为 Nginx 服务器无法验证服务器的 SSL证书,因为它没有正确配置必要的根证书,相对给Nginx配置根证书,直接取消验证更简单一些。

resty.http更多用法:https://github.com/ledgetech/lua-resty-http#request

Nginx配置鉴权脚本

下面我们配置Nginx的核心脚本:

http {map $http_upgrade $connection_upgrade {  default upgrade;''      close;}...server {listen       80;server_name  localhost;location ^~ /xxx/websocket {proxy_pass http://localhost:9999;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}location /xxx/ {rewrite_by_lua_file lua/auth.lua;proxy_pass http://localhost:9999;proxy_hide_header X-Frame-Options;proxy_hide_header Content-Security-Policy;proxy_hide_header X-Xss-Protection;add_header Access-Control-Allow-Origin *;}}resolver 8.8.8.8;
}

上面最核心的配置是rewrite_by_lua_file lua/auth.lua;

注意:resolver是必须配置的,用于配置DNS服务器,否则auth.lua脚本的HTTP请求无法正确获取响应。

rewrite_by_lua_file 指定了前面编写的鉴权脚本lua/auth.lua,相对openresty所在的根目录下。

image-20231204221010924

附录

lua读取请求参数的其他用法

--获取请求header
local reqHeaders = ngx.req.get_headers();
--读取cookie中的pcip值
local pcip = ngx.var.cookie_pcip;
--获取请求URI
local requestUri = ngx.var.request_uri;
--获取请求域名
local requestHost = ngx.var.host;
----获取请求方法类型GET POST
local reqType= ngx.var.request_method;

openresty的基本框架

image-20231204222041698

openresty中文站:http://openresty.org/cn/

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

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

相关文章

视频分割方法:批量剪辑高效分割视频,提取m3u8视频技巧

随着互联网的快速发展&#xff0c;视频已成为获取信息、娱乐、学习等多种需求的重要载体。然而&#xff0c;很多时候&#xff0c;需要的只是视频的一部分&#xff0c;这就要对视频进行分割。而m3u8视频是一种常见的流媒体文件格式&#xff0c;通常用于在线视频播放。本文将分享…

【前端首屏加载速度优化(0): 谷歌浏览器时间参数】

DOMContentLoaded 浏览器已经完全加载了 HTML&#xff0c;DOM树构建完成&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 Load DOM树构建完成后&#xff0c;继续加载 html/css 中的外部资源&#xff0c;加载完成之后&#xff0c;视为页面加载完成。…

听说这样寄快递会很省钱!速来收藏!便宜寄快递!

哈喽&#xff0c;小伙伴们&#xff0c;今天介绍一个寄快递省钱的小妙招。话不多说&#xff0c;小编直接开整&#xff01; 在闪侠惠递这个快递折扣平台下单送快递&#xff0c;不仅方便&#xff0c;而且运费更便宜。平台整合了京东、顺丰、圆通、申通、极兔、等快递公司可供选择…

【学习笔记】混淆矩阵

混淆矩阵&#xff08;Confusion Matrix&#xff09;&#xff0c;又称为错误矩阵&#xff0c;是一种特别适用于监督学习中分类问题评估模型性能的工具。在机器学习领域&#xff0c;混淆矩阵能够清晰地显示算法模型的分类结果和实际情况之间的差异&#xff0c;常用于二分类和多分…

任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代&#xff0c;恶意攻击者的主要攻击手法是将可执行脚本&#xff08;WebShell&#xff09;上传至目标服务器&#xff0c;以达到控制目标服务器的目的。 此漏洞成立的前提条件至少有下面两个&#xff1a; 1.可以上传对应的脚本文件&#xff0c;…

第一个小记录达成:第一个年费会员用户

早上看到&#xff0c;欸&#xff0c;有个用户好像充了 9.9 元&#xff0c;挺开心&#xff0c;刚刚看飞书消息&#xff0c;看到了这条分享给朋友&#xff0c;等等&#xff0c;是充值了 99 元&#xff0c;有个用户充了年费&#xff0c;偶买噶&#xff0c;开心 &#x1fae1; 这是…

华为OD机试 - 仿LISP运算 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

hql面试题之上海某资深数仓开发工程师面试题-求不连续月份的月平均值

1.题目 A,B两组产品的月平均值&#xff0c;月平均值是当月的前三个月值的一个平均值&#xff0c;注意月份是不连续的&#xff0c;如果当月的前面的月份不存在&#xff0c;则为0。如A组2023-04的月平均值为2023年1月的数据加2023-02月的数据的平均值&#xff0c;因为没有其他月…

股票代码合法验证:python字符串str应用

从键盘输入六位股票代码字符串&#xff0c;判定合法并输出板块分类&#xff0c;否则输出“NO”。 (笔记模板由python脚本于2023年12月04日 19:19:07创建&#xff0c;本篇笔记适合熟悉python字符串和字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https:…

Oracle 中换行chr(10)、回车chr(13)

一、前言 chr(n)&#xff1a;返回 ascii 值对应的字符。 ascii(char)&#xff1a;返回字符 char对应的ascii 值。 chr(n) 和 ascii(char) 作用刚好是相反的。 SQL> select chr(65) from dual; 控制台显示&#xff1a;ASQL> select ascii(A) from dual; 控制台显示&am…

开源CDN软件GoEdge —— 筑梦之路

官方网站&#xff1a;GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件&#xff0c;目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰&#xff0c;安装简单&a…

Android,JNI开发和NDK之间的联系

Android&#xff0c;JNI开发和NDK。 1.jni和ndk jni是在jdk中就有出现的 在我们jdk路径中 D:\java\jdk11\include 这就是jdk中的jni Android开发环境中的ndk也有jni&#xff0c; D:\Android\sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\in…

解决msvcp140.dll丢失问题的5种方法,验证有效

在计算机编程和软件开发中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;比如msvcp140.dll。这些DLL文件是动态链接库&#xff08;Dynamic Link Libraries&#xff09;的缩写&#xff0c;它们包含了可以被多个程序共享的代码和数据。那么&#xff0c;msvcp140.dll是…

优思学院|六西格玛中的过程管理思维

过程是什么&#xff1f; 过程&#xff08;Process&#xff09;是一系列相互关联的活动&#xff0c;将输入转化为输出&#xff0c;我们习惯于用 X 来表示输入&#xff0c;用 Y 来表示输出&#xff0c;就如下图一样。在产品&#xff08;服务&#xff09;质量形成过程中&#xff…

【ArcGIS Pro微课1000例】0048:深度学习--人群计数

文章目录 一、小学回忆录二、深度学习计算人头数三、案例实现一、小学回忆录 加载配套实验数据包中的图片及训练模型。你还记得当年的小学毕业班有多少同学吗?今天我们就用ArcGIS提供的人工智能工具,重温一下童年记忆。 二、深度学习计算人头数 本案例使用到的是深度学习中…

UNDERSTANDING AND IMPROVING INFORMATION TRANSFER IN MULTI-TASK LEARNING

Z i _i i​ X i R i X_iR_i Xi​Ri​&#xff0c; X X X是Task embedding layers&#xff0c; R R R是Alignment matrices 辅助信息 作者未提供代码

github setting在哪

像创建一个ssh连接&#xff0c; 参考&#xff1a;【Github问题解决】解决Github&#xff1a;fatal:unable to access ‘https://github.com/.../.git‘:Could not resolve host:git_阳的糖的博客-CSDN博客

安全测试之推荐工具(一)

文章目录 一、前言二、Web安全&#xff08;一&#xff09;AppScan&#xff08;推荐&#xff09;&#xff08;二&#xff09;AWVS&#xff08;推荐&#xff09;&#xff08;三&#xff09;Burp Suite&#xff08;推荐&#xff09;&#xff08;四&#xff09;OWASP ZAP 三、主机安…

《python每天一小段》--(9)使用Paramiko库,批量操作linux服务器

使用Paramiko库&#xff0c;批量操作多Linux服务器 使用Paramiko库建立SSH连接并执行命令获取多个Linux服务器的磁盘信息。通过这个例子&#xff0c;你可以学习到如何使用Python自动化操作远程服务器。 操作如图&#xff1a; 查看了两台服务器的磁盘容量&#xff1a; 安装模…

Socket 编程

1&#xff1a;针对 TCP 应该如何 Socket 编程&#xff1f; 服务端和客户端初始化 socket&#xff0c;得到文件描述符&#xff1b; 服务端调用 bind&#xff0c;将 socket 绑定在指定的 IP 地址和端口; 服务端调用 listen&#xff0c;进行监听&#xff1b; 服务端调用 accept&am…