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 enabledelayedexpansion

set "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 nginx

echo "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 then
	ngx.exit(400)
end
if token ~= "123" then
	ngx.exit(401)
end

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

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

local token = ngx.var.arg_token
if not token then
	ngx.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 then
    ngx.exit(402)
end
if res.body ~= "success" then
    ngx.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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试【理论基础】

软件测试的IEEE定义&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;目的是检验软件系统是否满足规定的需求&#xff0c;并找出与预期结果之间的差异。 软件测试的发展趋势&#xff1a; ① 测试工作将进一步前移。软件测试不仅仅是单元测试、集成测…

Java中三种定时任务总结(schedule,quartz,xxl-job)

目录 1、Spring框架的定时任务 2、Quartz Quartz的用法 3、xxl-job 3.1 docker 安装xxl-job 3.2 xxl-job编程测试 补充&#xff1a;Java中自带的定时任务调度 1. java.util.Timer和java.util.TimerTask 2. java.util.concurrent.Executors和java.util.concurrent.Sche…

前端开发_CSS

CSS定义 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签里面书…

Qt应用开发(Quick篇)——矩形模块 Rectangle

一、前言 矩形模块用于用纯色或渐变填充区域&#xff0c;或者提供一个矩形边框。 二、外观 每个矩形项都可以使用使用color属性指定的纯填充色、使用gradient类型定义并使用gradient属性设置的渐变来绘制。如果同时指定了颜色和渐变效果&#xff0c;则只会生效渐变效果。 通过…

探讨Unity中的动画融合技术(BlendTree)

动画在游戏和虚拟现实应用中扮演着关键的角色&#xff0c;而动画融合技术则是使角色动作更加流畅和逼真的核心。在Unity引擎中&#xff0c;我们可以使用动画混合树&#xff08;Blend Trees&#xff09;来实现这一目标。本篇技术博客将深入讨论动画融合技术的实现原理、在Unity中…

jsp前端输入中文数据传到controller变成问号?的解决办法

还是写老师布置的实验的时候&#xff0c;解决了xml文件找不到的问题之后又遇到新的问题&#xff1a;前端登录处输入用户名和密码&#xff0c;结果明明输入的用户名是对的密码也是对的&#xff08;输入的用户名是中文&#xff09;&#xff0c;它就是显示用户名或密码错误。然后我…

高压配电室智能运维

高压配电室智能运维是指通过运用先进的物联网、大数据、云计算等技术&#xff0c;对高压配电室进行智能化、远程化的运行维护&#xff0c;实现高压配电室的安全、高效、经济运行。以下是高压配电室智能运维的主要功能和优势&#xff1a; 实时监测&#xff1a;通过传感器和监测设…

Vue3引入markdown编辑器--Bytemd

字节跳动开源了一款markdown编辑器&#xff0c;bytemd&#xff0c;项目地址&#xff1a;GitHub - bytedance/bytemd: ByteMD v1 repository 安装 npm i bytemd/vue-next 引入方式如下&#xff0c;再main.js中引入样式 import bytemd/dist/index.css 直接封装一个Markdown编…

JavaEE进阶学习:SpringBoot 的创建和使用

1.什么是Spring Boot Spring 的诞生是为了简化 Java 程序的开发的&#xff0c;而 Spring Boot 的诞生是为了简化 Spring 程序开发的。 Spring Boot 翻译一下就是 Spring 脚手架&#xff0c;它就是为了快速开发 Spring 框架而诞生的 2.Spring Boot 优点 起步依赖 (创建的时候…

深入浅出理解kafka

1.Kafka简介 Kafka 本质上是一个 MQ&#xff08;Message Queue&#xff09;&#xff0c;使用消息队列的优点&#xff1a; 解耦&#xff1a;允许独立的扩展或修改队列两边的处理过程。可恢复性&#xff1a;即使一个处理消息的进程挂掉&#xff0c;加入队列中的消息仍然可以在系…

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…

数据结构第六课 -----链式二叉树的实现

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

价差后的几种方向,澳福如何操作才能盈利

在价差出现时&#xff0c;澳福认为会出现以下几种方向。 昂贵资产的贬值和便宜资产的平行升值。昂贵的资产贬值&#xff0c;而便宜的资产保持不变。昂贵资产的贬值和便宜资产的平行贬值&#xff0c;但昂贵资产的贬值速度更快&#xff0c;超过便宜资产。更贵的一对的进一步升值和…

python pyaudio对音频进行端点检测,检测出说话区间

python pyaudio对音频进行端点检测&#xff0c;检测出说话区间 主要采用过零率和语音能量来进行检测&#xff0c;并设置双阈值。 代码如下&#xff1a; # -*- coding: utf-8 -*- import wave import os import matplotlib.pyplot as plt import numpy as np# 判断是否变号 de…

大数据技术学习笔记(四)—— HDFS

目录 1 HDFS 概述1.1 HDFS 背景与定义1.2 HDFS 优缺点1.3 HDFS 组成架构1.4 HDFS 文件块大小 2 HDFS的shell操作2.1 上传2.2 下载2.3 HDFS直接操作 3 HDFS的客户端操作3.1 Windows 环境准备3.2 获取 HDFS 的客户端连接对象3.3 HDFS文件上传3.4 HDFS文件下载3.5 HDFS删除文件和目…

Lab 3: Recursion, Tree Recursion(CS61A 2020)

在网上没有lab3相应的答案&#xff0c;作者也卡蛮久 作者可能就自己的卡住过的问题做一些总结&#xff0c;不能面面俱到&#xff0c;请见谅 &#xff08;就此补充一下答案&#xff09;&#xff08;完整答案在最后&#xff09; Q2: WWPD: Journey to the Center of the Earth…

AcW730.机器人跳跃问题(二分法)-Java版

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;//由题目可知,无论能量大与小,都满足 e 2 * e - h[i]; //初始能量越大,最终的结果越大,要找到一个满足条件的最小值 //可以根据二分的向左找模板: /*if(check(mid)) r mid;els…

【C++ STL】vector类最全详解(什么是vector?vector类的常用接口有哪些?)

目录 一、前言 二、什么是vector ? &#x1f4a6; vector的基本概念 &#x1f4a6;vector的作用是什么 &#x1f4a6;总结 三、 vector的(一维)定义 四、vector(一维)常用接口的使用 &#x1f4a6;vector的常见构造&#xff08;初始化&#xff09; &#x1f4a6;vector…

11. 哈希冲突

上一节提到&#xff0c;通常情况下哈希函数的输入空间远大于输出空间&#xff0c;因此理论上哈希冲突是不可避免的。比如&#xff0c;输入空间为全体整数&#xff0c;输出空间为数组容量大小&#xff0c;则必然有多个整数映射至同一桶索引。 哈希冲突会导致查询结果错误&#…

探索人工智能领域——每日20个名词详解【day6】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…