Java中 Spring Security AuthenticationEntryPoint 怎么包装自定义认证异常

风丽小哥_6447

风丽小哥_6447

2026-07-14

605人浏览

原创

authenticationentrypoint不捕获异常,而是主动触发401响应;自定义认证异常(如customauthexception)需继承authenticationexception,在filter或provider中抛出,并通过@controlleradvice统一处理返回结构化json。

java中 spring security authenticationentrypoint 怎么包装自定义认证异常

在 Spring Security 中,AuthenticationEntryPoint 负责处理未认证请求(如访问需要登录的接口但未携带有效凭证),默认会返回 401 响应。若想将自定义认证异常(比如 CustomAuthException)统一包装并响应给前端,不能直接靠 AuthenticationEntryPoint 捕获异常——因为它本身不参与异常抛出流程,而是“主动触发”的入口逻辑。

理解关键分工:EntryPoint ≠ 异常处理器

AuthenticationEntryPoint 的作用是:当 SecurityContext 中无认证信息、且过滤器链中后续认证失败(或未尝试认证)时,由它发起未认证响应。它不接收或处理异常,所以不能在这里“捕获”自定义异常。

真正抛出自定义认证异常的地方通常是:

  • 自定义 AuthenticationProviderUserDetailsService 中(如账号锁定、验证码错误)
  • JWT 解析失败时的 OncePerRequestFilter(如 token 过期、签名无效)
  • 方法级安全(@PreAuthorize)校验失败时的拒绝逻辑

用 AuthenticationException 子类承载业务语义

Spring Security 的异常体系基于 AuthenticationException。要让自定义异常被统一识别和响应,需继承它,并可附加状态码、错误码、提示信息:

public class CustomAuthException extends AuthenticationException {
    private final int errorCode;
    private final String userMessage;

    public CustomAuthException(String msg, int errorCode) {
        super(msg);
        this.errorCode = errorCode;
        this.userMessage = msg;
    }

    // getter...
}

在过滤器或 Provider 中直接抛出该异常,例如:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
if (!jwtValidator.isValid(token)) {
    throw new CustomAuthException("Token 已失效", 1002);
}

通过 AuthenticationExceptionResolver 统一响应

Spring Security 5.7+ 推荐使用 AuthenticationExceptionResolver(配合 ExceptionHandlingConfigurer)替代旧式 AccessDeniedHandler + 全局异常处理器混用的方式。但更通用、可控的做法是结合 AuthenticationEntryPoint 和全局异常处理器:

  • AuthenticationEntryPoint 处理「无认证」场景(如未带 token),返回标准 401
  • 全局 @ControllerAdvice 捕获 AuthenticationException 及其子类,统一格式化响应

示例:

@ControllerAdvice
public class SecurityExceptionHandler {

    @ExceptionHandler(CustomAuthException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ResponseBody
    public Result> handleCustomAuthException(CustomAuthException e) {
        return Result.fail(e.getErrorCode(), e.getUserMessage());
    }

    @ExceptionHandler(AuthenticationException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ResponseBody
    public Result> handleAuthException(AuthenticationException e) {
        return Result.fail(1000, "未授权访问");
    }
}

确保异常能被正确传播

注意过滤器中抛出异常后是否被吞掉。例如在自定义 JWT 过滤器中:

public class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        try {
            // 解析 token、设置 Authentication 到 SecurityContext
            ...
        } catch (CustomAuthException e) {
            // ⚠️ 必须 re-throw,否则不会进入全局异常处理器
            throw e;
        }
        filterChain.doFilter(request, response);
    }
}

如果只是 e.printStackTrace() 或静默忽略,异常就丢失了,自然无法包装。

本质上,不是“包装 AuthenticationEntryPoint 中的异常”,而是让自定义异常沿 Spring MVC 异常传播链到达 @ControllerAdvice,再由它生成结构化响应。EntryPoint 只管兜底的未认证入口,异常响应交给更合适的机制处理。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java spring security

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8697

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5902

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5312

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1136

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2309

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19651

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习