当前位置: 首页 > news >正文

NGINX `ngx_http_auth_request_module` 模块详解基于子请求的认证授权方案

一、背景介绍

在 Web 系统中,我们常常需要根据外部服务(例如单点登录、API 网关、权限中心)的结果来判断用户是否有权限访问某个资源。NGINX 提供的 ngx_http_auth_request_module 模块,正是为这种场景而生。它允许通过向后端发送一个“子请求”来进行授权校验,并根据子请求的返回结果决定是否允许访问主请求。

二、模块简介

ngx_http_auth_request_module 模块从 NGINX 1.5.4 版本引入,并且 默认未编译进 NGINX,需要使用 --with-http_auth_request_module 参数在编译时启用。

该模块的工作机制非常简单高效:

  • 如果子请求返回 2xx 响应,表示授权成功,主请求可以继续处理。
  • 如果子请求返回 401403,主请求直接返回对应的错误码。
  • 其他响应码(如 500、404)则被视为错误。

对于 401 响应,模块还会将子请求的 WWW-Authenticate 响应头透传给主请求的客户端。

三、典型应用场景

  • 接入单点登录(SSO)系统
  • 与外部权限中心集成
  • 与 API 网关配合做细粒度访问控制
  • 支持多租户、不同角色的访问权限隔离

四、示例配置

以下是一个常见的配置案例:

location /private/ {auth_request /auth;proxy_pass http://backend;
}location = /auth {proxy_pass http://auth_backend;proxy_pass_request_body off;proxy_set_header Content-Length "";proxy_set_header X-Original-URI $request_uri;
}

解释:

  • /private/:需要授权保护的业务路径。
  • /auth:专门处理授权的子请求路径。
  • proxy_pass_request_body off;:告诉 NGINX 不将请求体传给授权服务(通常授权不需要请求体)。
  • proxy_set_header Content-Length "";:清除请求体长度,避免后端误解。
  • proxy_set_header X-Original-URI $request_uri;:将原始请求 URI 传递给授权服务。

当用户访问 /private/ 时,NGINX 会先对 /auth 发起子请求,由授权服务返回是否允许访问。

五、核心指令详解

1. auth_request

语法

auth_request uri | off;

默认值off

作用:指定用来授权的子请求 URI。如果设置为 off,则关闭授权检查。

示例:

auth_request /auth;

2. auth_request_set

语法

auth_request_set $variable value;

作用:在授权请求完成后,将某个值(通常是子请求返回头部中的值)保存到 NGINX 变量中。

示例:

auth_request_set $auth_status $upstream_http_x_auth_status;

通过这个指令,你可以把子请求返回的 X-Auth-Status 响应头保存到 $auth_status 变量里,用于后续日志、条件判断等。

六、与其他模块结合使用

ngx_http_auth_request_module 可以和其他模块一起用,例如:

  • ngx_http_access_module(IP 限制模块)
  • ngx_http_auth_basic_module(基本认证模块)
  • ngx_http_auth_jwt_module(JWT 模块)

使用 satisfy 指令灵活组合多重访问控制:

location /private/ {satisfy any;allow 192.168.1.0/24;deny all;auth_request /auth;
}

这段配置的意思是:只要 IP 允许或者授权服务通过,用户就可以访问。

七、最佳实践建议

  1. 开启缓存
    从 NGINX 1.7.3 开始,可以为授权子请求开启 proxy_cache,大幅降低后端负载。
location = /auth {proxy_cache auth_cache;proxy_cache_valid 200 10m;proxy_cache_valid 401 10m;proxy_pass http://auth_backend;
}
  1. 减少请求体传输
    使用 proxy_pass_request_body offproxy_set_header Content-Length "",避免向授权后端传递不必要的请求体。

  2. 传递必要信息
    通过自定义请求头(如 X-Original-URIX-Forwarded-For),让授权服务获取更多上下文信息。

八、总结

ngx_http_auth_request_module 是 NGINX 中一颗隐藏的宝石。它小巧灵活,不仅能让 NGINX 支持与外部系统的无缝集成,还能极大提升复杂系统的访问控制能力。通过合理使用这个模块,你可以轻松实现:

单点登录接入
API 网关认证
外部权限系统对接
高性能、高扩展的权限架构

相关文章:

NGINX `ngx_http_auth_request_module` 模块详解基于子请求的认证授权方案

一、背景介绍 在 Web 系统中,我们常常需要根据外部服务(例如单点登录、API 网关、权限中心)的结果来判断用户是否有权限访问某个资源。NGINX 提供的 ngx_http_auth_request_module 模块,正是为这种场景而生。它允许通过向后端发送…...

Qwen3简要介绍(截止20250506)

Qwen3是阿里云推出的一个大语言模型系列,它在多个方面进行了升级和优化。以下是Qwen3的一些主要特点: 模型规模多样:Qwen3提供了一系列不同规模的模型,包括稠密模型(0.6B、1.7B、4B、8B、14B、32B)以及专家…...

精益数据分析(42/126):移动应用商业模式的深度剖析与实战要点

精益数据分析(42/126):移动应用商业模式的深度剖析与实战要点 在创业和数据分析的学习之路上,我们持续探索不同商业模式的奥秘,今天聚焦于移动应用商业模式。我希望和大家一起进步,深入解读《精益数据分析…...

2025.5.6总结

昨天12:30睡觉,结果翻来覆去睡不着,两点半左右才睡着。看了一下最近的睡眠打卡,平均入睡时间是凌晨12:30。 自五一一个人过了5天,我才明白,人是需要社交的,只有在社交中才能找到自我…...

UE5 脚部贴地不穿过地板方案

UE自带的IK RIG和ControlRig技术 【UE5】角色脚部IK——如何让脚贴在不同斜度的地面(设置脚的旋转)_哔哩哔哩_bilibili 实验后这个还是有一部分问题,首先只能保证高度不能穿过,但是脚步旋转还是会导致穿模 IK前,整个模型在斜坡上会浮空 参考制作:https://www.youtube.com/w…...

Spring AI 函数调用(Function Call)系统设计方案

一、系统概述与设计目标 1.1 核心目标 从零构建一个灵活、安全、高效的函数调用系统,使大语言模型能够在对话中调用应用程序中的方法,同时保持良好的开发体验和企业级特性。 1.2 主要功能需求 支持通过注解将普通Java方法标记为可被AI调用的函数自动生成符合LLM要求的函数…...

Jupyter Notebook为什么适合数据分析?

Jupyter Notebook 是一款超实用的 Web 应用程序,在数据科学、编程等诸多领域都发挥着重要作用。它最大的特点就是能让大家轻松创建和共享文学化程序文档。这里说的文学化程序文档,简单来讲,就是把代码、解释说明、数学公式以及数据可视化结果…...

Leetcode Hot 100字母异位词分词

题目描述 思路 根据题意,我们可以得知我们需要将字符统计数一样的字符串,放在一起,并以列表进行返回。因此我们可以通过一个哈希表,把统计相同的放在一起,最终返回即可 代码 class Solution:def groupAnagrams(self…...

用python实现鼠标监听与手势交互

摘要 本文探讨了一种基于Python的数学函数可视化系统的设计与实现,该系统整合了Pynput鼠标事件监听机制、Matplotlib绘图引擎以及PyQt5图形用户界面框架。系统通过人机交互方式实现了函数图像的直观构建与可视化表达,支持多种函数类型的参数化建模与实时…...

UE5 GAS开发P47 游戏标签

FGameplayTag 是 Unreal Engine 中用于标记游戏对象的系统。它允许开发者为游戏对象分配标签,以便在游戏中对其进行分类、识别和操作。 FGameplayTag 结构用于表示单个游戏标签,而 FGameplayTagContainer 则用于表示一组游戏标签。 这些标签可以用于诸…...

C# 实现PLC数据自动化定时采集与存储(无需界面,自动化运行)

C# 实现PLC数据自动化定时采集与存储(无需界面,自动化运行) 在平时开发中,我们时常会遇到需要后台静默运行的应用场景,这些程序不需要用户的直接操作或界面展示,而是专注于定时任务的执行。比如说&#xf…...

Java实现堆排序算法

1. 堆排序原理图解 堆排序是一种基于二叉堆(通常使用最大堆)的排序算法。其核心思想是利用堆的性质(父节点的值大于或等于子节点的值)来高效地进行排序。堆排序分为两个主要阶段:建堆和排序。 堆排序步骤: …...

封装axios,实现取消请求

封装axios import axios from axios// 创建自定义的请求类 class CancelableRequest {constructor() {this.controller new AbortController()}abort() {this.controller.abort()} }// 创建 axios 实例 const service axios.create({baseURL: process.env.VUE_APP_BASE_API,…...

在 Laravel 12 中实现 WebSocket 通信

在 Laravel 12 中实现 WebSocket 通信主要有两种主流方案:‌官方推荐的 Laravel Reverb‌ 和 ‌第三方库(如 Soketi/Pusher 或 Workerman/Swoole)‌。以下是详细实现步骤: 一、官方方案:Laravel Reverb(推…...

iPhone或iPad想要远程投屏到Linux系统电脑,要怎么办?

苹果手机自带AirPlay投屏功能,对于苹果电脑,自然可以随时投屏。但如果电脑是Linux系统,而且还想要远程投屏呢?这时候要怎么将iPhone或iPad投屏到Linux电脑? 方法很简单,用AirDroid Cast的网页版即可。 步骤…...

Ubuntu 22.04 安装配置远程桌面环境指南

在云服务器或远程主机上安装图形化桌面环境,可以极大地提升管理效率和用户体验。本文将详细介绍如何在 Ubuntu 22.04 (Jammy Jellyfish) 系统上安装和配置 Xfce4 桌面环境,并通过 VNC 实现远程访问。 系统环境 操作系统:Ubuntu 22.04 LTS (Jammy Jellyfish)架构:AMD64安装…...

【Redis | 基础总结篇 】

目录 前言: 1.Redis的介绍: 2.Redis的类型与命令: 3.Redis的安装: 3.1.Windows版本 3.2.Linux版本 4.在java中使用Redis: 4.1.介绍 4.2.Jedis 4.3.Spring Data Redis 前言: 本篇主要讲述了Redis的…...

如何通过外网访问内网?对比5个简单的局域网让互联网连接方案

在实际应用中,常常需要从外网访问内网资源,如远程办公访问公司内部服务器、在家访问家庭网络中的设备等。又或者在本地内网搭建的项目应用需要提供互联网服务。以下介绍几种常见的外网访问内网、内网提供公网连接实现方法参考。 一、公网IP路由器端口映…...

iMeta | 临床研究+scRNA-seq的组合思路 | 真实世界新辅助研究,HER2⁺就一定受益?单细胞揭示真正的“疗效敏感克隆”

👋 欢迎关注我的生信学习专栏~ 如果觉得文章有帮助,别忘了点赞、关注、评论,一起学习 近年来,临床医学与单细胞组学的结合开启了全新的研究范式,让临床医生能以“显微镜”般的精度,深入理解疾病机制与疗效…...

国标GB28181视频平台EasyCVR安防系统部署知识:如何解决异地监控集中管理和组网问题

在企业、连锁机构及园区管理等场景中,异地监控集中管控与快速组网需求日益迫切。弱电项目人员和企业管理者亟需整合分散监控资源,实现跨区域统一管理与实时查看。 一、解决方案 案例一:运营商专线方案​ 利用运营商专线,连接各分…...

220V降12V1000mA非隔离芯片WT5110

220V降12V1000mA非隔离芯片WT5110 以下是采用WT5110芯片的非隔离降压电源电路设计,将220V电压转换为12V、1000mA输出: 一、WT5110芯片简介 WT5110是一款用于非隔离降压应用的集成电路,具备宽输入电压范围和高效的转换功能。它可以将高输入电…...

【ES】Elasticsearch字段映射冲突问题分析与解决

在使用Elasticsearch作为搜索引擎时,经常会遇到一些映射(Mapping)相关的问题。本文将深入分析字段映射冲突问题,并通过原生的Elasticsearch API请求来复现和解决这个问题。 问题描述 在实际项目中,我们遇到以下错误: Transport…...

【上位机——MFC】绘图

相关类 CDC类(绘图设备类):封装了各种绘图相关的函数,以及两个非常重要的成员变量m_hDC和m_hAttribDC CPaintDC类,封装了在WM_PAINT消息中绘图的绘图设备 CClientDC类,封装了在客户区绘图的绘图设备 CGdiObject类(绘图对象类) 封…...

【AI】Ubuntu 22.04 evalscope 模型评测 Qwen3-4B-FP8

安装evalscope mkdir evalscope cd evalscope/ python3 -m venv venv source venv/bin/activate pip install evalscope[app,perf] -U -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.compip install tiktoken omegaconf -i https://mirrors.aliyu…...

js var a=如果ForRemove=true,是“normal“,否则为“bold“

你是想根据变量 ForRemove 的布尔值来给变量 a 赋值,如果 ForRemove 为 true,则 a 的值是 "normal",否则为 "bold"。在 JavaScript 里,你可以使用 if...else 语句或者三元运算符来实现。 方法一:…...

JavaScript性能优化实战:从瓶颈分析到解决方案

前言 在当今快节奏的互联网环境中,用户对网站性能的期望日益提高。 JavaScript作为前端开发的核心语言,其性能直接影响用户体验。本文将深入探讨JavaScript代码中常见的性能瓶颈,并结合实际案例分享优化技巧和工具,帮助开发者提升…...

CyberSentinel AI开源程序 是一个自动化安全监控与AI分析系统

​一、软件介绍 文末提供程序和源码下载 CyberSentinel AI 开源程序是一个强大的自动化安全监控与AI分析系统,旨在帮助安全研究人员和爱好者 实时追踪最新的安全漏洞 (CVE) 和 GitHub 上的安全相关仓库,并利用 人工智能技术进行深度分析,最终…...

C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)

文章目录 引言C23新特性概述std::generator基本概念定义作用模板参数 std::generator特性分析与协程的结合范围视图内存管理 std::generator使用示例std::generator的优势与挑战优势挑战 总结 引言 在C的发展历程中,每一个新版本都带来了许多令人期待的新特性和改进…...

FoMo 数据集是一个专注于机器人在季节性积雪变化环境中的导航数据集,记录了不同季节(无雪、浅雪、深雪)下的传感器数据和轨迹信息。

2025-05-02,由加拿大拉瓦尔大学北方机器人实验室和多伦多大学机器人研究所联合创建的 FoMo 数据集,目的是研究机器人在季节性积雪变化环境中的导航能力。该数据集的意义在于填补了机器人在极端季节变化(如积雪深度变化)下的导航研…...

Github上如何准确地搜索开源项目

Github上如何准确地搜索开源项目: 因为寻找项目练手是最快速掌握技术的途径,而Github上有最全最好的开源项目。 就像我的毕业设计“机器翻译”就可以在Github上查找开源项目来参考。 以下搜索针对:项目名的关键词,关注数限制&a…...

从 MDM 到 Data Fabric:下一代数据架构如何释放 AI 潜能

从 MDM 到 Data Fabric:下一代数据架构如何释放 AI 潜能 —— 传统治理与新兴架构的范式变革与协同进化 引言:AI 规模化落地的数据困境 在人工智能技术快速发展的今天,企业对 AI 的期望已从 “单点实验” 转向 “规模化落地”。然而&#…...

个人Unity自用面经(未完)

目录标题 1.在 2D 平台跳跃游戏项目中,你使用了对象池来生成和回收怪物包含阵亡的动画预制件。在对象池回收对象时,如何确保动画状态被正确重置,避免下次使用时出现异常?2.在僵尸吃脑子模拟项目中,你创建了继承于IAspe…...

【Pandas】pandas DataFrame agg

Pandas2.2 DataFrame Function application, GroupBy & window 方法描述DataFrame.apply(func[, axis, raw, …])用于沿 DataFrame 的轴(行或列)应用一个函数DataFrame.map(func[, na_action])用于对 DataFrame 的每个元素应用一个函数DataFrame.a…...

LearnOpenGL---绘制三角形

绘制三角形 #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream>const unsigned int SCR_WIDTH 800; const unsigned int SCR_HEIGHT 600;/// <summary> /// 当用户改变窗口大小时&#xff0c;视口也应该被调整&#xff0c;因此编…...

使用 Poco C++ 库构建轻量级 HTTP 服务器

在现代 C 后端开发中&#xff0c;如果你需要构建一个轻量、高性能、可嵌入式的 HTTP 服务&#xff0c;而不愿引入重量级框架如 Boost.Beast 或 cpp-httplib&#xff0c;那么 Poco C Libraries 提供了一个优雅的解决方案。Poco 是一套广泛使用的 C 框架&#xff0c;涵盖网络、线…...

【Java EE初阶 --- 多线程(初阶)】多线程的基本内容

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 前言认识多线程(Thread的…...

CTF-DAY8

[LitCTF 2023]babyLCG 题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) bit_len m.bit_length() a getPrime(bit_len) b getPrime(bit_len) p getPrime(bit_len1)seed m result [] for i in range(10):seed (a*see…...

CSS--图片链接垂直居中展示的方法

原文网址&#xff1a;CSS--图片链接垂直居中展示的方法-CSDN博客 简介 本文介绍CSS图片链接垂直居中展示的方法。 图片链接 问题复现 源码 <html xml:lang"cn" lang"cn"><head><meta http-equiv"Content-Type" content&quo…...

用html+js+css实现的战略小游戏

效果图: 兄弟们&#xff0c;话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…...

【落羽的落羽 C++】list及其模拟实现

文章目录 一、list介绍二、list模拟实现1. 节点2. 迭代器3. list 一、list介绍 list是我们之前学过的带头双向链表的类模板&#xff0c;具有链表的一系列性质&#xff0c;也有多种多样的接口便于使用&#xff0c;使用方法与vector大体相似&#xff1a; 函数接口说明list()构造…...

深入理解高性能网络通信:从内核源码到云原生实践

深入理解高性能网络通信&#xff1a;从内核源码到云原生实践 前言 随着互联网业务规模的高速增长&#xff0c;服务端网络通信能力成为系统性能的核心瓶颈。如何支撑百万级连接、在极限场景下实现低延迟高吞吐&#xff1f;本篇博客将围绕Linux通信机制内核剖析、性能调优实战、…...

全格式文档转 Markdown 工具,Docker 一键部署,支持 API 调用

以下是简要介绍&#xff1a; 这是一款可以快速将任意文档文件转markdown格式内容的工具&#xff0c;提供API转换接口&#xff0c;方便集成与应用原理就是利用libreoffice、pandoc文件转换工具&#xff0c;把所有文档类型的文件逐步转化&#xff0c;最终转成markdown格式的内容…...

算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)

深度优先搜索&#xff08;DFS&#xff09;、递归 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。在 DFS 算法中&#xff0c;从起始节点开始&#xff0c;沿着一条路径尽可能深地访问节点&#xff0c;直到到达叶子节…...

Windows玩游戏的时候,一按字符键就显示桌面

最近打赛伯朋克 2077 的时候&#xff0c;不小心按错键了&#xff0c;导致一按字符键就显示桌面。如下&#xff1a; 一开始我以为是输入法的问题&#xff08;相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦&#xff09;&#xff0c;但是后来解决半天发现并不是。在网上搜…...

2025 后端自学UNIAPP【项目实战:旅游项目】1、创建项目框架

1、创建项目 ①项目名称&#xff1a;自定义&#xff0c;【我是travel】 ②vue版本&#xff1a;vue3 ③其他默认&#xff0c;最后创建 2、创建页面 ①展开自己刚才创建的项目 ②单击选中pages文件夹 --->鼠标右键---->新建页面 ③页面名称&#xff1a;自定义favouri…...

Tomcat中Web应用程序停止时为了防止内存泄漏,JDBC驱动程序被强制取消注册出现原因

1.问题描述 本地Windows环境开发的Springboot项目同样的mysql版本&#xff0c;jdk版本&#xff0c;tomcat版本&#xff0c;本地运行没有任何问题&#xff0c;发布到阿里云服务器上时报以下问题&#xff1a; 06-May-2025 20:06:12.842 警告 [main] org.apache.catalina.loader…...

vitepress 复杂环境引入 mermaid

方式一&#xff1a; 参考官网&#xff0c;这里不赘述 。 方式二&#xff1a; pnpm add -D vitepress-plugin-mermaid pnpm add -D mermaidimport { MermaidMarkdown, MermaidPlugin } from vitepress-plugin-mermaid;export default defineConfig({markdown: {config(md) {md…...

盘古信息领德创|半导体存储与云计算存储小巨人企业IMS数字化升级项目正式启动!

在数字化和智能化浪潮下&#xff0c;数据已然成为企业核心资产。随着大模型应用加速落地和智算新基建推进&#xff0c;数据量呈爆炸式增长&#xff0c;存储作为数据基础设施的关键环节&#xff0c;正从传统的容量与性能保障&#xff0c;向数据智能处理、高效管理及安全可靠的全…...

Oracle04-基本使用

零、文章目录 Oracle04-基本使用 1、创建表空间 &#xff08;1&#xff09;创建语句 create tablespace testdata datafile c:\datafile\testdata.dbf size 100m autoextend on next 10m&#xff08;2&#xff09;参数说明 testdata&#xff1a;表空间名称datafile&#x…...

YOLO 从入门到精通学习指南

一、引言 在计算机视觉领域,目标检测是一项至关重要的任务,其应用场景广泛,涵盖安防监控、自动驾驶、智能交通等众多领域。YOLO(You Only Look Once)作为目标检测领域的经典算法系列,以其高效、快速的特点受到了广泛的关注和应用。本学习指南将带领你从 YOLO 的基础概念…...