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

Spring Security配置了AccessDeniedHandler却无效?别急,先检查你的全局异常处理器

Spring Security异常处理冲突排查指南当AccessDeniedHandler遇上全局异常处理器最近在重构一个老项目的权限模块时遇到了一个看似简单却让人抓狂的问题明明按照文档配置了AccessDeniedHandler但权限不足时依然直接抛出AccessDeniedException自定义的处理器完全没起作用。经过一番debug和源码追踪终于搞清楚了这背后的机制。今天就来分享这个排查过程希望能帮到遇到同样问题的开发者。1. 问题重现为什么我的AccessDeniedHandler不生效假设我们已经按照标准方式实现了自定义的AccessDeniedHandlerpublic class CustomAccessDeniedHandler implements AccessDeniedHandler { Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { response.setContentType(application/json;charsetUTF-8); response.getWriter().write({\code\:403,\message\:\权限不足\}); } }并在Security配置中进行了注册Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.exceptionHandling() .accessDeniedHandler(new CustomAccessDeniedHandler()); } }同时项目中还有一个全局异常处理器ControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(Exception.class) ResponseBody public ResponseEntityErrorResponse handleException(Exception ex) { return ResponseEntity.status(500) .body(new ErrorResponse(500, 服务器内部错误)); } }这时候当权限不足时我们期望看到的是CustomAccessDeniedHandler返回的JSON响应但实际上却得到了全局异常处理器返回的500错误。这显然不是我们想要的结果。2. 异常处理链的优先级之争要理解这个问题我们需要深入Spring Security和Spring MVC的异常处理机制Spring Security的异常处理流程当权限检查失败时会抛出AccessDeniedExceptionExceptionTranslationFilter捕获这个异常调用配置的AccessDeniedHandler处理异常Spring MVC的异常处理流程任何未被处理的异常都会向上冒泡最终被ControllerAdvice标记的全局异常处理器捕获关键在于AccessDeniedException最终会被哪个组件捕获通过调试可以发现虽然ExceptionTranslationFilter确实调用了我们的CustomAccessDeniedHandler但随后这个异常还是被继续抛出最终被全局异常处理器捕获。这是因为Spring Security的异常处理并不终止异常传播默认情况下AccessDeniedHandler处理完异常后异常仍然会被重新抛出全局异常处理器具有更高的优先级会覆盖Security的异常处理3. 解决方案三种处理方式对比3.1 方案一在全局异常处理器中特殊处理AccessDeniedExceptionControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(AccessDeniedException.class) ResponseBody public ResponseEntityErrorResponse handleAccessDenied(AccessDeniedException ex) { return ResponseEntity.status(403) .body(new ErrorResponse(403, 权限不足)); } ExceptionHandler(Exception.class) ResponseBody public ResponseEntityErrorResponse handleException(Exception ex) { return ResponseEntity.status(500) .body(new ErrorResponse(500, 服务器内部错误)); } }优点统一管理所有异常处理逻辑代码集中便于维护缺点与Security的异常处理机制解耦可能忽略Security特有的处理需求3.2 方案二修改AccessDeniedHandler不重新抛出异常public class CustomAccessDeniedHandler implements AccessDeniedHandler { Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { response.setContentType(application/json;charsetUTF-8); response.getWriter().write({\code\:403,\message\:\权限不足\}); // 关键变化不再抛出异常 return; } }优点保持Security异常处理的独立性避免异常传播到全局处理器缺点需要确保所有错误情况都被正确处理可能遗漏某些需要全局处理的场景3.3 方案三组合使用两种机制public class CustomAccessDeniedHandler implements AccessDeniedHandler { Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { // 只处理Security相关的逻辑 log.warn(Access denied for request: {}, request.getRequestURI()); // 仍然抛出异常让全局处理器处理响应 throw accessDeniedException; } } ControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(AccessDeniedException.class) ResponseBody public ResponseEntityErrorResponse handleAccessDenied(AccessDeniedException ex) { // 统一格式化响应 return ResponseEntity.status(403) .body(new ErrorResponse(403, 权限不足)); } }优点职责分离Security处理安全日志全局处理器处理响应格式灵活性高便于扩展缺点实现稍复杂需要明确划分处理边界4. 深入原理Spring异常处理机制解析要彻底理解这个问题我们需要看看Spring的异常处理机制是如何工作的。以下是关键组件的交互流程FilterChainProxySpring Security的入口过滤器ExceptionTranslationFilterSecurity的异常转换过滤器捕获AuthenticationException和AccessDeniedException调用对应的EntryPoint或HandlerDispatcherServletSpring MVC的核心控制器处理过程中抛出的异常会被捕获查找合适的HandlerExceptionResolverExceptionHandlerExceptionResolver处理ExceptionHandler注解的解析器检查是否有匹配的ExceptionHandler方法优先匹配最具体的异常类型关键点在于ExceptionTranslationFilter的处理并不终止请求处理流程异常仍然会传播到DispatcherServlet。而ControllerAdvice定义的全局异常处理器具有更高的优先级会覆盖Security的处理。5. 最佳实践安全与统一的异常处理策略经过多次项目实践我总结出以下推荐做法职责分离原则Security组件专注于安全相关的处理如日志记录全局异常处理器专注于响应格式的统一响应一致性所有错误响应使用相同的结构包含错误码、消息和可选详情日志记录策略在AccessDeniedHandler中记录详细的访问拒绝信息在全局异常处理器中记录未处理的异常示例实现// Security配置 http.exceptionHandling() .accessDeniedHandler((request, response, exception) - { log.warn(Access denied for {} by user {}: {}, request.getRequestURI(), SecurityContextHolder.getContext().getAuthentication().getName(), exception.getMessage()); throw exception; // 仍然抛出由全局处理器处理 }); // 全局异常处理器 ControllerAdvice public class GlobalExceptionHandler { private static final Logger log LoggerFactory.getLogger(GlobalExceptionHandler.class); ExceptionHandler(AccessDeniedException.class) public ResponseEntityErrorResponse handleAccessDenied(AccessDeniedException ex) { return ResponseEntity.status(HttpStatus.FORBIDDEN) .body(new ErrorResponse(FORBIDDEN, 没有访问权限)); } ExceptionHandler(Exception.class) public ResponseEntityErrorResponse handleUnexpectedException(Exception ex) { log.error(Unexpected error, ex); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse(INTERNAL_ERROR, 服务器内部错误)); } } // 统一错误响应结构 public record ErrorResponse(String code, String message) {}这种架构既保持了安全组件的独立性又确保了错误响应的统一性在实际项目中表现良好。

相关文章:

Spring Security配置了AccessDeniedHandler却无效?别急,先检查你的全局异常处理器

Spring Security异常处理冲突排查指南:当AccessDeniedHandler遇上全局异常处理器 最近在重构一个老项目的权限模块时,遇到了一个看似简单却让人抓狂的问题:明明按照文档配置了AccessDeniedHandler,但权限不足时依然直接抛出Access…...

踩坑实录:NFS挂载环境下脚本执行权限问题(Operation not permitted)的深度排查与解决

在企业级部署中,NFS(网络文件系统)常被用来共享存储资源,方便多节点统一访问数据与安装包。但这种“便捷共享”的环境,也常常隐藏着各种权限陷阱。最近在KingbaseES数据库安装部署中,我就踩了一个典型的NFS…...

微软office365怎么安装?(保姆级流程)

1、微软office官网(www.office.com)--登录(报名后老师给的账号)2、登录后的界面3、应用--安装应用程序--Microsoft 365应用版4、下载office软件安装程序到桌面(或者你能找到的地方)5、找到安装程序并双击安…...

LFM2.5-VL-1.6B惊艳效果展示:OCR文档理解+结构化信息提取真实案例

LFM2.5-VL-1.6B惊艳效果展示:OCR文档理解结构化信息提取真实案例 1. 模型概述 LFM2.5-VL-1.6B是由Liquid AI推出的轻量级多模态大模型,专为端侧和边缘设备优化设计。这个1.6B参数的视觉语言模型(1.2B语言400M视觉)在保持轻量化的…...

ECS LIVA Mini Box QC710 ARM迷你主机评测与购买指南

1. ECS LIVA Mini Box QC710 迷你主机深度解析 最近在Stack Social平台上发现一款正在清仓促销的迷你主机——ECS LIVA Mini Box QC710,原价219美元现在仅售99.99美元。这款基于高通骁龙7c平台的迷你电脑在2021年推出时定位为开发者套件,如今价格腰斩后是…...

桥梁健康监测系统如何选?海陵区城市生命线项目中标单位为您解读

桥梁作为城市交通网络的关键节点,其结构安全状态直接关系到市民出行安全和城市运转效率。近年来,国内外多起桥梁安全事故为我们敲响了警钟,桥梁健康监测系统已成为城市生命线安全工程中不可或缺的重要组成部分。江苏星文科技有限公司作为海陵…...

数据库三大范式:从概念到实战,一篇文章彻底搞懂

为什么你的表设计总出问题?为什么数据冗余、更新异常、插入异常、删除异常频频发生?很可能是范式没用好。今天我们用最通俗的语言,把这三大范式讲清楚、讲透彻。数据库设计是一门艺术,而范式就是这门艺术的“基本法”。掌握三大范…...

基于安卓的农村劳动力信息匹配系统毕设

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓平台的农村劳动力信息匹配系统以解决当前农村劳动力市场中存在的信息不对称与供需错配问题。随着我国城镇化进程的持续推进以及…...

Flux2-Klein-9B-True-V2多场景落地:政府宣传海报/公益广告图生成实践

Flux2-Klein-9B-True-V2多场景落地:政府宣传海报/公益广告图生成实践 1. 项目概述 Flux2-Klein-9B-True-V2是基于官方FLUX.2 [klein] 9B改进的文生图/图生图模型,专为高质量图像生成与编辑任务优化。该模型在保持原始模型强大生成能力的基础上&#xf…...

灵机一物AI原生电商小程序、PC端(已上线)-从 Vibe Coding 到 Wish Coding:AI 编程范式跃迁与蚂蚁灵光技术解读

摘要本文对比 Vibe Coding 与 Wish Coding 技术路径,解析蚂蚁灵光闪应用升级要点、灵光圈协作机制,探讨 Coding Agent 从开发者工具走向全民消费级产品的行业趋势。1. Vibe Coding 定位与边界1.1 核心逻辑- 面向:专业开发者- 入口&#xff1a…...

Phi-3.5-mini-instruct入门必看:网页封装+参数详解+中文场景调优指南

Phi-3.5-mini-instruct入门必看:网页封装参数详解中文场景调优指南 1. 模型简介 Phi-3.5-mini-instruct是一款专为中文场景优化的轻量级文本生成模型,特别适合日常问答、内容创作和知识辅助等任务。相比大型语言模型,它在保持良好生成质量的…...

XSKY 与平凯星辰(TiDB)完成联合解决方案互认证,存储+数据库联合交付能力再获验证

近日,XSKY 星辰天合与平凯星辰(北京)科技有限公司正式完成联合解决方案互认证。本次认证覆盖 XSKY 旗下 XEBS V6(星飞极速版)、XHERE V6(星飞极速版)、XEDP V6 三款核心产品与平凯星辰的平凯数据…...

告别变量地狱:手把手教你用Simulink结构体管理复杂模型参数(附实战案例)

告别变量地狱:手把手教你用Simulink结构体管理复杂模型参数(附实战案例) 打开一个大型Simulink模型时,你是否曾被工作区里密密麻麻的变量列表吓到?Gain_A、Offset_B、Init_C...这些看似有规律的命名,随着模…...

【Docker 27跨架构镜像转换终极指南】:20年DevOps专家亲授arm64/x86双平台无缝构建与推送实战

第一章:Docker 27跨架构镜像转换的核心演进与定位Docker 27 引入了原生集成的 docker buildx bake 与增强版 buildkit 调度器,将跨架构镜像构建从“多阶段手动交叉编译”推进至“声明式统一构建流水线”。其核心演进体现在三方面:构建上下文感…...

二维DFT图像频域分析:从基础原理到实战应用

前言 一维DFT我们已经玩明白了,知道它能把复杂信号拆成一堆正弦波。那二维DFT呢?简单说,就是把这个“拆解魔法”搬到了图像上。一张图片,其实也可以看作是二维信号,二维DFT就能把它拆解成无数个不同方向、不同频率的二…...

2026口碑靠前的备考增强记忆品牌榜单

这份口碑靠前的备考增强记忆品牌榜单是结合成分合规性、市场口碑、权威认证、场景适配性多个维度整理得出,能给备考人群选择脑营养补充产品提供清晰可靠的参考方向。这份口碑靠前的备考增强记忆品牌榜单的评选维度是什么?本次评选围绕三个核心指标筛选&a…...

【仅限持牌机构内部流通】:Docker 27金融隔离黄金配置矩阵(含Kubernetes 1.30+PodSecurity Admission适配表、FIPS 140-3认证路径)

第一章:Docker 27金融交易数据容器隔离概览在高并发、低延迟的金融交易系统中,数据隔离不仅是安全合规的核心要求,更是防止跨业务线干扰、保障交易一致性与审计可追溯性的基础设施能力。Docker 27(即 Docker Engine v27.x&#xf…...

谷歌Next年度大会智能体登场,OpenAI/微美全息构筑“AI芯片+智能体”生态受瞩目

北京时间周四,美国云服务巨头谷歌(GOOG.US)举行2026 Next大会,发布了旨在推动企业工作流程全面转向智能体的“代理式企业”(Agentic Enterprise)技术栈,涵盖第八代TPU、智能体软件平台等一系列前…...

Hive 技术文章大纲

Hive 技术文章大纲1. Hive 简介Hive 的定义及其在大数据生态系统中的角色Hive 与关系型数据库的区别Hive 的主要特点(如 SQL 兼容性、扩展性、批处理能力)2. Hive 架构与核心组件Hive 的整体架构(Metastore、Driver、Compiler、Executor 等&a…...

打破次元壁:在华为Pura X Max上体验华为阅读独家AI动态漫画力量!

作为一名长期混迹数码圈的科技博主,我本以为屏幕折叠、刷新率卷到头后,手机的阅读体验很难再有质的飞跃。但4月20日发布的华为Pura X Max,配合新升级的华为阅读最新独家技术,确实给了我一点小小的“鸿蒙震撼”。大家平时看漫画&am…...

别再手动配环境了!用CMake+VS2022一键搞定PCL点云库(附完整项目模板)

现代C点云开发实战:基于CMake与VS2022的PCL高效配置指南 点云处理已成为计算机视觉、自动驾驶和三维重建领域的核心技术之一。对于C开发者而言,Point Cloud Library (PCL)提供了强大的工具集,但传统的配置方式往往令人望而生畏——手动设置包…...

广州海珠智能体案例中的“咨询+干预+随访”多智能体协作:医疗AI从“单点工具”到“执行系统”的范式转移

引言:从“工具”到“系统”的范式转移在过去的几年中,人工智能在医疗领域的应用取得了显著进展。从辅助医生识别肺结节的影像系统,到自动生成电子病历的自然语言处理工具,AI技术正逐步渗透到诊疗的各个环节。然而,这些…...

千问3.5-9B在C语言教学中的应用:代码分析与调试助手

千问3.5-9B在C语言教学中的应用:代码分析与调试助手 1. 引言:编程教学的新帮手 "老师,我这个程序为什么运行不了?"——这句话可能是每个C语言课程助教最常听到的提问。传统编程教学中,教师需要面对大量基础…...

3分钟解决C盘爆红问题:WindowsCleaner终极清理指南

3分钟解决C盘爆红问题:WindowsCleaner终极清理指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 还在为Windows系统越用越慢而烦恼吗?当…...

Phi-3.5-mini-instruct开源可部署指南:自主可控的轻量级AI代码助手

Phi-3.5-mini-instruct开源可部署指南:自主可控的轻量级AI代码助手 1. 项目介绍 Phi-3.5-mini-instruct是微软推出的轻量级开源指令微调大模型,在代码理解和多语言任务上表现优异。这个模型特别适合作为本地AI代码助手使用,能够在单张RTX 4…...

智慧树自动刷课插件终极指南:3分钟解放双手,高效完成在线课程

智慧树自动刷课插件终极指南:3分钟解放双手,高效完成在线课程 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的繁琐视频播放流…...

Qwen3.5-9B-GGUF实战教程:llama-cpp-python参数调优全解析

Qwen3.5-9B-GGUF实战教程:llama-cpp-python参数调优全解析 1. 模型与项目概述 Qwen3.5-9B-GGUF是阿里云通义千问3.5系列中的90亿参数稠密模型,经过GGUF格式量化后,可以在消费级硬件上高效运行。该模型采用创新的Gated Delta Networks架构和…...

Java 面试:从微服务到数据库的幽默探讨

Java 面试:从微服务到数据库的幽默探讨 在这篇文章中,我们将通过一个幽默而又严肃的面试场景来探讨 Java 求职者在互联网大厂面试中可能遇到的技术问题。面试官将提出与微服务、数据库、测试框架等相关的问题,而搞笑的水货程序员燕双非则在回…...

UHMWPE板有哪些厂家

在众多的土工材料中,UHMWPE板(超高分子量聚乙烯板)凭借其优异的耐磨性、耐冲击性和自润滑性等特点,广泛应用于防弹服、合成溜冰场、各种耐磨机械零件及食品机械等领域。今天,山东龙翔新材料有限公司就为大家带来一份UH…...

Weka集成学习实战:Boosting、Bagging与Stacking对比

1. 使用Weka进行集成学习实验的完整指南作为一名长期使用Weka进行机器学习研究和教学的从业者,我发现集成学习方法在实际项目中能显著提升模型性能。本文将带你一步步在Weka Experimenter中设计并运行一个完整的集成学习实验,比较Boosting、Bagging和Ble…...