惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
Y
Y Combinator Blog
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Martin Fowler
Martin Fowler
博客园_首页
大猫的无限游戏
大猫的无限游戏
美团技术团队
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
小众软件
小众软件
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
N
Netflix TechBlog - Medium
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园 - 【当耐特】
J
Java Code Geeks
F
Fortinet All Blogs
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
博客园 - 司徒正美

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
SpringSecurity 静态资源放行深度详解(解决401认证失败、文...
SheepDog1998 · 2026-05-13 · via 博客园_首页

一、前言

在 SpringBoot 项目中,只要引入 SpringSecurity 安全框架,所有接口、资源默认都会被拦截,必须携带 Token、登录认证后才能访问。

实际开发中,经常存在无需登录即可访问的资源:

  • 临时生成的 Excel、PDF、图片等下载文件

  • 登录接口、验证码接口

  • 静态资源:html、js、css、图片

  • 第三方回调、心跳检测接口

本文以 Excel 文件下载被拦截 401为实战案例,抽象通用放行逻辑,搞懂底层原理,以后遇到任何资源拦截问题,均可直接套用方案解决。

二、实战业务场景 & 报错现象

2.1 业务场景

后端生成 Excel 文件存放在服务器临时目录,通过资源映射配置访问路径:/excel/\*\*,前端、APP 通过 URL 直接下载文件。

2.2 报错信息

{"msg":"认证失败,无法访问系统资源","code":401}

2.3 报错特征

  • 接口本身无代码报错,后台无异常

  • 浏览器直接访问文件地址,返回 401 未授权

  • 登录后携带 Token 可以正常访问,未登录直接拦截

三、底层原理:为什么会被拦截?

3.1 SpringSecurity 默认拦截规则

SpringSecurity 内置拦截链,默认规则:

所有请求,全部需要认证;没有明确放行的路径,一律拦截。

执行优先级:

  1. 客户端发起请求(文件/接口)

  2. 进入 SpringSecurity 拦截过滤器链

  3. 匹配放行规则(permitAll\(\)

  4. 匹配成功:直接放行,无需认证

  5. 匹配失败:校验 Token、登录状态,无权限直接抛出 401 认证失败

3.2 本次 Excel 文件拦截原因

文件访问地址:http://ip:port/excel/xxx\.xlsx

Security 不会识别这是静态文件,只会识别请求路径 /excel/,该路径未配置放行,因此判定为需要登录认证,最终返回 401。

四、核心解决方案:配置资源放行

4.1 放行核心语法

4.1.1 旧版 Security(Ruoyi 通用版本)

.antMatchers("/excel/**").permitAll()

4.1.2 新版 Security 6.0+

.requestMatchers("/excel/**").permitAll()

4.2 完整配置代码(Ruoyi 项目通用)

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        // 放行登录、验证码接口
        .antMatchers("/login","/captcha/**").permitAll()
        // 放行Excel下载静态资源(核心代码)
        .antMatchers("/excel/**").permitAll()
        // 其余所有请求必须认证
        .anyRequest().authenticated();
}

4.3 语法详解

语法 作用说明
/excel/\*\* 匹配规则:以 /excel/ 开头的所有子路径,包含所有Excel文件
permitAll\(\) 永久放行,无需登录、无需Token、无需权限

五、关联知识点:静态资源映射 + 放行联动

很多新手只配置放行,依旧无法访问文件,原因是:缺少静态资源映射,二者必须搭配使用。

5.1 两者区别

  • 静态资源映射(WebConfig):告诉 Spring,访问 /excel/ 去哪里找本地物理文件(解决404)

  • Security放行配置:告诉安全框架,这个路径不用登录(解决401)

5.2 配套静态资源映射代码

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 将 /excel/** 映射到服务器相对路径upload/excel/
        registry.addResourceHandler("/excel/**")
                .addResourceLocations("file:./upload/excel/");
    }
}

5.3 完整链路(401+404双问题解决)

  1. 请求:/excel/test\.xlsx

  2. Security 拦截 → 匹配放行规则 → 直接放行(无401)

  3. Spring 资源处理器 → 匹配映射规则 → 读取本地文件(无404)

  4. 返回文件流,浏览器/APP 直接下载

六、高频踩坑总结(避坑重点)

6.1 坑1:放行路径和映射路径不一致

映射路径:/file/\*\*,放行路径写:/excel/\*\*,路径不统一,依旧拦截。

解决方案:映射、放行、访问URL三者前缀必须完全一致。

6.2 坑2:新版Security使用旧语法

Security6.0以上禁止使用 antMatchers,必须改用 requestMatchers,否则项目启动报错。

6.3 坑3:放行位置书写错误

必须写在 \.anyRequest\(\)\.authenticated\(\)前面,写在后面放行失效。

6.4 坑4:带Token访问放行资源

放行资源本身无需认证,若携带过期Token,部分版本会判定认证失败,建议APP下载文件不携带Token

七、通用模板:以后直接复制套用

7.1 通用静态资源放行模板(旧版Security/Ruoyi)

// 无需认证放行路径
.antMatchers(
        "/login",
        "/captcha/**",
        "/excel/**",    // Excel文件下载
        "/image/**",    // 图片访问
        "/file/**"      // 通用文件
).permitAll()

7.2 通用静态资源映射模板

registry.addResourceHandler("/自定义前缀/**")
        .addResourceLocations("file:./本地相对路径/");

八、总结

遇到 静态文件、公开接口、无需登录资源 被SpringSecurity拦截报401,固定解决步骤:

  1. 确定访问路径前缀(如 /excel/

  2. 在Security配置中添加放行规则 xxx\.permitAll\(\)

  3. 若为本地文件,补充静态资源映射,绑定物理路径

  4. 保证:访问路径=映射路径=放行路径三者一致

该逻辑适配:Excel、PDF、图片、公开接口、回调地址,是企业级 SpringBoot 项目必备基础知识点,一次弄懂,永久复用。