私有资源认证

发布时间:2026/10/25 15:56:08

私有资源认证 一、 架构设计与请求流转核心流程图客户端(浏览器)│ ▼(1. 请求受保护资源 /secure/data.pdf 或 /api/user/info)┌─────────────────────────────────────────────────────┐ │ Nginx(反向代理静态资源服务器)│ │ ├─(2)拦截请求发起内部子请求(auth_request)│ │ │ └─转发至 /_auth(携带 Cookie/Token, 原始URI)│ │ │ │ │ ├─(3)接收 Spring Boot 鉴权结果 │ │ │ ├─200OK: 提取用户信息放行请求 │ │ │ ├─401Unauthorized: 重定向到登录页或返回401 │ │ │ └─403Forbidden: 返回无权限页面 │ │ │ │ │ └─(4)鉴权通过将请求转发给后端业务服务或返回静态文件│ └─────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────┐ ┌─────────────────────────┐ │ Spring Boot(鉴权服务)│ │ Spring Boot(业务服务)│ │ - 校验 Token/JWT │ │ - 直接读取 Nginx 传来的 │ │ - 校验 URL/RBAC 权限 │ │ X-User-Id 等 Header │ │ - 返回200/401/403 │ │ - 无需再解析 Token │ └─────────────────────────┘ └─────────────────────────┘二、 Nginx 生产级配置在生产环境中Nginx 配置需要处理凭证传递、原始 URI 传递、错误重定向、以及跨域预检OPTIONS放行。. --with-http_auth_request_module 添加auth模块# 定义上游服务upstream auth_backend{server127.0.0.1:8080;# Spring Boot 鉴权服务keepalive64;# 生产环境必须开启长连接降低子请求延迟}upstream biz_backend{server127.0.0.1:8081;# Spring Boot 业务服务keepalive64;}server{listen443ssl http2;server_name example.com;# --- 生产环境安全基础配置 ---ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_protocols TLSv1.2 TLSv1.3;add_header X-Frame-OptionsSAMEORIGINalways;add_header X-Content-Type-Optionsnosniffalways;# 1. 公开资源 (登录页、静态JS/CSS/图片等不走鉴权)location /public/{root /var/www/html;expires 7d;# 强缓存}# 2. 受保护的前端页面或静态资源 (如内部报表、敏感文档)location /secure/{# 开启鉴权子请求auth_request /_auth;# 鉴权失败处理error_page401/public/login.html;# 未登录重定向到登录页error_page403/public/403.html;# 无权限提示页# 【关键】将鉴权子请求返回的用户信息注入到转发给后端的 Header 中auth_request_set$user_id$upstream_http_x_user_id;auth_request_set$user_role$upstream_http_x_user_role;# 如果是代理到后端业务服务传递用户信息proxy_set_header X-User-Id$user_id;proxy_set_header X-User-Role$user_role;# 如果是直接返回静态文件则不需要 proxy_passalias/var/www/secure_files/;}# 3. 受保护的 API 接口location /api/{auth_request /_auth;auth_request_set$user_id$upstream_http_x_user_id;proxy_set_header X-User-Id$user_id;proxy_pass http://biz_backend;}# 4. 核心鉴权子请求接口 (内部隐藏)location/_auth{internal;# 禁止外部直接访问此路径proxy_pass http://auth_backend/api/auth/check;# 生产环境性能优化不传递 Body只传 Headerproxy_pass_request_body off;proxy_set_header Content-Length;# 传递客户端真实 IPproxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;# 【关键】传递原始请求的 URI 和 Method供 Spring Boot 做细粒度 RBAC 校验proxy_set_header X-Original-URI$request_uri;proxy_set_header X-Original-Method$request_method;# 【关键】传递鉴权凭证 (Cookie 或 Authorization Header)proxy_set_header Cookie$http_cookie;proxy_set_header Authorization$http_authorization;# 保持长连接proxy_http_version1.1;proxy_set_header Connection;}}三、 生产级案例在生产环境中对私有资源认证。server{listen1443ssl;server_name localhost;ssl_certificate../ssl/chat.crt;ssl_certificate_key../ssl/chat.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location/_auth{internal;proxy_pass http://127.0.0.1:8080/auth/check;proxy_pass_request_body off;proxy_set_header Content-Length;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header X-Original-URI$request_uri;proxy_set_header X-Original-Method$request_method;proxy_set_header Cookie$http_cookie;proxy_set_header Authorization$http_authorization;proxy_set_header Token$http_token;proxy_http_version1.1;proxy_set_header Connection;}location /public{root html;index index.html index.htm;}location /private{set$main_args$args;auth_request /_auth;error_page401/public/index_401.html;error_page403/public/index_403.html;auth_request_set$user_id$upstream_http_x_user_id;auth_request_set$user_role$upstream_http_x_user_role;proxy_set_header X-User-Id$user_id;proxy_set_header X-User-Role$user_role;root html;index index.html index.htm;}}鉴权实现。packagecom.app.sso.user;importcom.app.sso.component.RequestUtil;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.StringUtils;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.util.UriComponents;importorg.springframework.web.util.UriComponentsBuilder;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.util.Enumeration;importjava.util.HashMap;importjava.util.Map;/** * author wym13 */Slf4jRestControllerRequestMapping(/auth)publicclassUserAuthController{ResourceprivateRequestUtilrequestUtil;privatestaticfinalStringMSG_MISSING_TOKEN未携带token;privatestaticfinalStringMSG_AUTH_SUCCESS认证成功;privatestaticfinalStringMSG_INVALID_TOKEN无权访问;GetMapping(/check)publicMapString,Objectauth(HttpServletRequestrequest,HttpServletResponseresponse){HashMapString,ObjectresultnewHashMap(2);Stringtokenrequest.getHeader(token);if(StringUtils.isBlank(token)){StringoriginalUrirequest.getHeader(X-Original-URI);if(StringUtils.isNotBlank(originalUri)){try{UriComponentscomponentsUriComponentsBuilder.fromUriString(http://dummyoriginalUri).build();tokencomponents.getQueryParams().getFirst(token);}finally{log.info(originalUri{},queryParamsToken{},originalUri,token);}}}if(StringUtils.isBlank(token)){log.info(鉴权失败token为空, IP{}, URI{},getClientIp(request),request.getRequestURI());response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);result.put(code,HttpServletResponse.SC_UNAUTHORIZED);result.put(msg,MSG_MISSING_TOKEN);returnresult;}else{if(requestUtil.checkToken(token)){response.setStatus(HttpServletResponse.SC_OK);result.put(code,HttpServletResponse.SC_OK);result.put(msg,MSG_AUTH_SUCCESS);}else{response.setStatus(HttpServletResponse.SC_FORBIDDEN);result.put(code,HttpServletResponse.SC_FORBIDDEN);result.put(msg,MSG_INVALID_TOKEN);log.info(鉴权失败token无效, IP{},getClientIp(request));}}returnresult;}// 工具方法获取客户端IPprivateStringgetClientIp(HttpServletRequestrequest){Stringiprequest.getHeader(X-Forwarded-For);if(StringUtils.isBlank(ip)||unknown.equalsIgnoreCase(ip)){iprequest.getRemoteAddr();}returnip;}}
延伸阅读

更多相关文章

2026/10/25 23:21:30

EMSA凝胶迁移实验技术服务 | 生物素标记法 · 钟鼎生物

什么是EMSA凝胶迁移实验? EMSA(Electrophoretic Mobility Shift Assay,电泳迁移率实验) ,又称凝胶迁移实验或凝胶阻滞实验,是分子生物学领域研究蛋白质与核酸相互作用的经典技术手段。该技术广泛应用于转录…

2026/10/25 3:32:41

蓝桥杯国赛Python备考:从真题分析到高效刷题策略

1. 从“刷题”到“破局”:我的蓝桥杯国赛Python备赛心路最近后台和社群里,问蓝桥杯Python国赛怎么准备的同学特别多。很多人手里攒了一堆真题,但刷来刷去感觉还是原地踏步,遇到新题还是发懵。这感觉我太懂了,当年我也是…

2026/10/25 10:50:36

【全栈开发】----Mysql基本配置与使用

本篇是在已下载Mysql的情况下进行的,若还未下载或未创建Mysql服务,请转到这篇:> > 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)_mysql8.0.40下载安装教程-CSDN博客本文对于mysql的操作均使用控制台sql…

2026/10/26 13:03:25

C++信号处理类设计:采样、滤波、FFT与峰值检测实践

简介:面向C开发者与系统编程学习者的信号处理封装类代码,聚焦进程如何响应操作系统信号,并给出可复用的处理入口与生命周期管理思路。压缩包共2个文件,以1个头文件和1个实现文件为主,分别承载类接口声明与具体逻辑&…

2026/10/26 13:03:25

AI写GPU内核:6.6倍加速为何端到端只剩1.25倍?

1. 这场实验是怎么开始的:让 AI 接管 GPU 内核优化 1.1 基线数据才是整个账本的第一行 上个季度我给某个图像处理链路过内核,调优对象是一段运行在 GPU 上的图像预处理算子,主要做缩放、归一化、色彩空间转换,外加一轮 3x3 卷积。…

2026/10/26 13:03:25

机械化人眼:一种基于元认知校准的AI幻觉实时识别框架

1. 项目概述:这不是一个“检测器”,而是一次对AI幻觉的临床解剖“机械化人眼”——这个标题里没有一个技术术语,但每个字都在刺向当前大模型应用最痛的软肋:它不判断真假,只追求流畅。我们做的不是给AI加个“测谎仪”&…

2026/10/26 13:03:25

GPU内核加速6.6倍,端到端只有1.25倍:性能优化账本拆解

把一段 4K 视频帧的 RGB 图像预处理 CUDA 内核丢给 AI 重写,跑完基准测试后,屏幕上出现了两组反差极大的数字:内核执行时间快了 6.6 倍,但整条链路端到端只快了 1.25 倍。先别急着下结论,这个反差恰恰是 GPU 优化里最值…

2026/10/26 12:58:24

AI芯片选型避坑指南:读懂TOPS、能效比与带宽的真实含义

1. 这不是参数表,是AI芯片的“体检报告单” 你手头那张标着“算力XX TOPS”“能效比YY W/TOPS”的芯片参数页,真能当采购依据用?我见过太多团队拿着这张纸就拍板下单,结果模型一跑起来,显存爆了、温度飙到95℃、推理延…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑