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

Nginx auth_request详解

网上看到多篇先关文章,觉得很不错,这里合并记录一下,仅供学习参考。

模块

nginx-auth-request-module

该模块是nginx一个安装模块,使用配置都比较简单,只要作用是实现权限控制拦截作用。默认高版本nginx(比如1.12)已经默认安装该模块,下面介绍下使用该模块实现多个站点之间的统一权限控制。

例子1

这里用一个例子来说明下,如下例子是包含site1(对应web1)、site2(对应web2)、auth(20.131:7001)在内的三个应用项目,auth项目主要做权限拦截,比如jwt校验等,site1、site2分别为两个受保护的资源站点,只有auth授权通过后才能访问该站点。

实现上述要求nginx配置详情如下(nginx地址为20.198):

upstream web1 { server 192.168.20.131:3000; } upstream web2 { server 192.168.20.131:3001; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } location /api/web1 { auth_request /auth; error_page 401 = @error401; auth_request_set $user $upstream_http_x_forwarded_user; proxy_set_header X-Forwarded-User $user; proxy_pass http://web1; } location /api/web2 { auth_request /auth; error_page 401 = @error401; auth_request_set $user $upstream_http_x_forwarded_user; proxy_set_header X-Forwarded-User $user; proxy_pass http://web2; } location /auth { internal; proxy_set_header Host $host; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_pass http://192.168.20.131:7001/auth; } location @error401 { add_header Set-Cookie "NSREDIRECT=$scheme://$http_host$request_uri;Path=/"; return 302 http://192.168.20.131:7001/login; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

配置好之后,要明白一点,那就是_nginx-auth-request-module_模块基本使用原理就是:

1、auth_request对应的路由返回401 or 403时,会拦截请求直接nginx返回前台401 or 403信息;

2、auth_request对应的路由返回2xx状态码时,不会拦截请求,而是构建一个subrequest请求再去请求真实受保护资源的接口;

所以,基于此,auth模块只需要校验然后返回相应的状态码即可实现权限拦截操作,简单测试如下:

auth代码:

// 授权认证接口 async auth() { console.log(Date.now()); this.ctx.status = 200; } // 失败后的登录页面 async login() { console.log('失败了........'); this.ctx.body = { msg: '授权失败', code: 10001 } }

这里的auth授权接口我们直接返回200,login是上述auth项目下配置的路由,用于授权失败后302至登录页面用的。

site1和site2代码相同,只罗列一个如下:

/* /api/web1/users,如果是web2则为/api/web2/users */ router.all('/', function(req, res, next) { res.send('respond with a resource from web1'); });

这里只是简单渲染输出一个字符串而已,测试如下:

浏览器访问:http://192.168.20.198/api/web1/users,输出:

改变auth接口如下:

// 授权认证接口 async auth() { console.log(Date.now()); this.ctx.status = 401; } // 失败后的登录页面 async login() { console.log('失败了........'); this.ctx.body = { msg: '授权失败', code: 10001 } }

这里将状态码改为了401,再次访问:http://192.168.20.198/api/web1/users,输出:

这里可以看到,浏览器直接进行了302跳转,因为鉴权失败,直接重定向到登录页面了。

以上就是关于_nginx-auth-request-module_模块的基本操作及配置,多个项目下部署统一的权限接口时还是相当有用的。

例子2

首先,确保Nginx已经安装并启用了auth_request模块。然后,编辑Nginx配置文件(通常是nginx.conf或某个虚拟主机配置文件)。

通过–with-http_auth_request_module添加auth_request模块

http {
# 定义认证服务的逻辑
server {
listen 127.0.0.1:8080;
location /auth {
# 此处为简单示例,实际应用中应调用外部认证服务
if ($http_authorization = “Basic dXNlcm5hbWU6cGFzc3dvcmQ=”) { # 假设认证使用Basic Auth
return 200;
}
return 401;
}
}

server {
listen 80;
server_name example.com;

location / {
# 使用 auth_request 调用认证服务
auth_request /auth;

# 处理认证服务的响应结果
error_page 401 = @error401;
error_page 403 = @error403;

# 正常处理请求
proxy_pass http://backend;
}

# 定义认证失败时的处理逻辑
location @error401 {
return 401 “Unauthorized”;
}

location @error403 {
return 403 “Forbidden”;
}

# 认证服务的代理设置
location /auth {
proxy_pass http://127.0.0.1:8080/auth;
proxy_pass_request_body off; # 不代理请求体到认证服务
proxy_set_header Content-Length “”;
proxy_set_header X-Original-URI $request_uri;
}
}
}

配置说明

定义认证服务:

server {
listen 127.0.0.1:8080;
location /auth {
if ($http_authorization = “Basic dXNlcm5hbWU6cGFzc3dvcmQ=”) {
return 200;
}
return 401;
}
}

这个server块模拟了一个简单的认证服务,它监听127.0.0.1:8080,根据请求头Authorization判断用户是否经过认证。在实际应用中,这个应该是一个调用外部服务的代理配置。

主站点配置:

server {
listen 80;
server_name example.com;

location / {
auth_request /auth;
error_page 401 = @error401;
error_page 403 = @error403;
proxy_pass http://backend;
}

location @error401 {
return 401 “Unauthorized”;
}

location @error403 {
return 403 “Forbidden”;
}

location /auth {
proxy_pass http://127.0.0.1:8080/auth;
proxy_pass_request_body off;
proxy_set_header Content-Length “”;
proxy_set_header X-Original-URI $request_uri;
}
}

  • auth_request /auth;:该指令告诉Nginx,在处理用户请求前,先将请求发送到/auth进行认证。
  • error_page 401 = @error401;和error_page 403 = @error403;:定义认证失败时的处理逻辑,将401或403错误重定向到相应的处理块。
  • proxy_pass http://backend;:成功认证后,将请求代理到后端服务器。
认证失败处理:

location @error401 {
return 401 “Unauthorized”;
}

location @error403 {
return 403 “Forbidden”;
}

认证失败时,根据实际情况返回401或403状态码,并附带相应的错误信息。

测试与验证

启动Nginx,尝试访问http://example.com,并使用不同的Authorization头部测试认证行为。如果头部包含正确的用户名和密码(在本例中为"Basic dXNlcm5hbWU6cGFzc3dvcmQ="),请求应被允许访问后端资源,否则返回相应的错误状态码。

例子3

upstream web1 {
server 192.168.20.131:3000;
}

upstream web2 {
server 192.168.20.131:3001;
}

location ^~ /session/ {

charset utf-8;
auth_request /session-backend-info/;
auth_request_set $backend $upstream_http_backend;

proxy_set_header Forwarded $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $remote_port;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_passb a c k e n d / backend/backend/request_uri;

}

$backend为web1、web2upstream

http://www.cnnetsun.cn/news/525890.html

相关文章:

  • FORTIFY代码扫描:小白也能懂的安全入门
  • “入职背景调查”,构建职场信任的第一道防线
  • 陪诊小程序开发运营全解析:技术架构+落地逻辑+合规要点
  • Thinkphp-Laravel北京地铁票务APP小程序
  • Thinkphp-Laravel本科生优秀作业交流网站vue
  • 2026年品牌排行榜:TOP5 EOR名义雇主人力资源解决方案推荐
  • API接口安全性设计:防止未授权访问与滥用的防护策略
  • 和测试角色相关的问题
  • LISTAGG、XMLAGG
  • Sambert-HifiGan企业级部署:高可用语音合成架构设计
  • Thinkphp-Laravel+uniapp微信小程序的毕业论文选题系统设计与实现
  • 在 ABAP Cloud 里用 sXML Writer 生成 XML:不靠 Transformation 也能把结构搭得很漂亮
  • 随笔小计-前端经常接触的http响应头(跨域CORS,性能-缓存-安全,token)
  • 为什么90%的大数据项目都栽在数据一致性上?资深架构师总结的避坑指南
  • 在 ABAP 环境用 Customer Data Browser 替代 SE16:一套兼顾自助查询与权限合规的数据浏览方案
  • 在 ABAP Cloud 用 XCO 生成 UUID:一行拿到稳定主键,并在多种格式间自由转换
  • 【开源】基于 C# 和 Halcon 机器视觉开发的车牌识别工具(附带源码)
  • 在 ABAP Cloud 用 XCO 读取 Call Stack 与 Tenant 信息:把调试线索和云身份带进日志体系
  • 【开发者导航】完全免费且灵活的域名注册与托管平台:FreeDomain
  • 视频动作不连贯?调整帧率和引导系数的正确姿势
  • LED阵列汉字显示实验:移位寄存器协同工作原理深入解读
  • 卷积神经网络在OCR中的应用:CRNN模型部署全流程详解
  • 合成语音版权归属?建议商业使用时加入声明避免法律风险
  • ddu官网技术复现:如何用开源方案构建企业级视频生成系统
  • 人类未掌握的100项量子物理规律是什么?
  • arm64架构下RK3588多核启动原理图解说明
  • 如何建立投资护城河
  • 【5G异构网络中移动边缘计算的高效能卸载技术 】面向大规模移动用户的多无人机移动边缘计算联合部署与任务调度优化研究附Matlab代码、Python代码
  • Sambert-HifiGan与VITS对比:中文语音合成技术选型指南
  • 图解说明Multisim安装步骤与关键节点确认