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 网关配合做细粒度访问控制
  • 支持多租户、不同角色的访问权限隔离

四、示例配置

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

nginx 复制代码
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

语法

nginx 复制代码
auth_request uri | off;

默认值off

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

示例:

nginx 复制代码
auth_request /auth;

2. auth_request_set

语法

nginx 复制代码
auth_request_set $variable value;

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

示例:

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 指令灵活组合多重访问控制:

nginx 复制代码
location /private/ {
    satisfy any;
    allow 192.168.1.0/24;
    deny all;
    auth_request /auth;
}

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

七、最佳实践建议

  1. 开启缓存
    从 NGINX 1.7.3 开始,可以为授权子请求开启 proxy_cache,大幅降低后端负载。
nginx 复制代码
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 网关认证

外部权限系统对接

高性能、高扩展的权限架构

相关推荐
不灭的程序员阿澄15 分钟前
Nginx 容器化部署实战:SPA 路由、Cookie 透传与 WebSocket 全配置详解
websocket·nginx·状态模式
HiDev_23 分钟前
【非标自动化】2、认识元器件(高速计数模块)
运维·自动化
小张同学a.1 小时前
MooseFS 分布式存储实战指南:部署、运维与 Pacemaker+SBD 高可用落地
linux·运维·分布式·pacemaker·moosefs·sbd
Csxyzj1 小时前
Nginx:企业高性能web服务器(一)
运维·服务器·nginx
Eloudy1 小时前
sunshine - ubuntu 22.04, moonlight - mac OS26 远程桌面
linux·运维·ubuntu
旗开得胜马到成功1 小时前
工控系统备份的底层技术解析:老旧协议、零停机窗口与中科热备的专项破局
运维·服务器·vr
AC赳赳老秦1 小时前
企业标签体系搭建:基于 OpenClaw 采集的多维度公开数据,构建企业画像标签库
java·运维·服务器·python·信息可视化·deepseek·openclaw
苍狗T1 小时前
K8s 集群实战:基于 Harbor 私有仓库 + cri‑dockerd 完整部署
linux·运维·云原生·容器·kubernetes
EXI-小洲1 小时前
Docker 容器部署 EMQX|MQTT 消息代理服务安装与配置教程
运维·mqtt·docker·emqx
石小千1 小时前
X86下载 ARM 架构的包
linux·运维