Spring Security自定义认证入口点:实现JSON格式未授权响应

Spring Security自定义认证入口点:实现JSON格式未授权响应

spring security默认的认证失败响应是html页面。本教程将指导如何通过实现自定义的authenticationentrypoint来拦截401未授权错误,并将其转换为统一的json格式响应,从而提供更友好的api错误处理机制。内容涵盖配置securityconfiguration、编写customauthenticationentrypoint以及相应的单元测试,确保api客户端能正确解析错误信息。

1. Spring Security默认的认证失败处理与API需求

在构建RESTful API时,客户端通常期望接收结构化的错误响应,例如JSON格式,而不是Web服务器生成的HTML错误页面。然而,Spring Security在处理用户未认证(HTTP 401 Unauthorized)的请求时,其默认行为是返回一个包含HTML内容的错误页面。这对于Web应用可能尚可接受,但对于API客户端来说,解析HTML以获取错误详情既不高效也不方便。

例如,当未认证用户访问受保护资源时,Spring Security可能返回类似以下内容的HTML响应:

    HTTP Status 401 – Unauthorized        

HTTP Status 401 – Unauthorized

而API客户端通常期望得到的是类似以下JSON格式的错误响应:

{    "errors": [        {            "status": "401",            "title": "UNAUTHORIZED",            "detail": "认证失败,请提供有效的凭据。"        }    ]}

为了满足这一需求,我们需要定制Spring Security的认证入口点(AuthenticationEntryPoint)。

2. 理解AuthenticationEntryPoint

AuthenticationEntryPoint是Spring Security提供的一个核心接口,用于处理未经认证的请求。当用户尝试访问受保护资源但未提供有效凭据时,或者提供的凭据无法通过认证时,Spring Security会调用配置的AuthenticationEntryPoint的commence方法。

commence方法签名如下:

void commence(HttpServletRequest request, HttpServletResponse response,              AuthenticationException authException) throws IOException, ServletException;

在该方法中,我们可以对HttpServletResponse进行操作,例如设置HTTP状态码、添加响应头,以及最重要的——写入自定义的响应体。

Find JSON Path Online Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30 查看详情 Find JSON Path Online

3. 实现自定义的JSON格式认证入口点

要实现JSON格式的未授权响应,关键在于在CustomAuthenticationEntryPoint中直接向HttpServletResponse的输出流写入JSON数据,而不是使用response.sendError()。response.sendError()方法通常会委托给Servlet容器来生成错误页面,这会导致返回HTML。

以下是一个实现自定义AuthenticationEntryPoint的示例:

import com.fasterxml.jackson.databind.ObjectMapper; // 推荐使用Jackson进行JSON序列化import jakarta.servlet.ServletException;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.AuthenticationEntryPoint;import org.springframework.stereotype.Component;import java.io.IOException;import java.util.Collections;import java.util.Map;@Componentpublic class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {    private final ObjectMapper objectMapper = new ObjectMapper(); // 用于JSON序列化    @Override    public void commence(HttpServletRequest request, HttpServletResponse response,                         AuthenticationException authException) throws IOException, ServletException {        // 设置响应内容类型为JSON        response.setContentType(MediaType.APPLICATION_JSON_VALUE);        // 设置HTTP状态码为401 Unauthorized        response.setStatus(HttpStatus.UNAUTHORIZED.value());        // 对于Basic认证,通常需要添加WWW-Authenticate头        response.addHeader("WWW-Authenticate", "Basic realm="Realm"");        // 构建自定义的错误响应体        // 实际项目中可以定义一个专门的ErrorResponse DTO        Map errorDetails = Map.of(                "status", HttpStatus.UNAUTHORIZED.value(),                "title", HttpStatus.UNAUTHORIZED.getReasonPhrase(),                "detail", authException.getMessage() != null ? authException.getMessage() : "认证失败,请提供有效凭据。"        );        Map errorResponse = Collections.singletonMap("errors", Collections.singletonList(errorDetails));        // 使用ObjectMapper将Map转换为JSON字符串并写入响应        objectMapper.writeValue(response.getWriter(), errorResponse);    }}

代码解析:

@Component:将CustomAuthenticationEntryPoint声明为一个Spring组件,以便可以被Spring容器管理。response.setContentType(MediaType.APPLICATION_JSON_VALUE):这是确保客户端将响应识别为JSON的关键步骤。response.setStatus(HttpStatus.UNAUTHORIZED.value()):显式设置HTTP状态码为401。response.addHeader(“WWW-Authenticate”, “Basic realm=”Realm””):如果使用Basic认证,此头是必要的,它告知客户端需要Basic认证。objectMapper.writeValue(response.getWriter(), errorResponse):这是将JSON数据写入响应体的核心。我们推荐使用ObjectMapper(如Jackson库提供)来序列化Java对象到JSON,因为它比手动拼接字符串更健壮、更灵活,尤其是在处理复杂对象时。errorResponse是一个简单的Map结构,模拟了预期的JSON格式。

4. 配置Spring Security以使用自定义入口点

接下来,我们需要在Spring Security的配置类中注册这个自定义的AuthenticationEntryPoint。这通常在继承WebSecurityConfigurerAdapter(或使用SecurityFilterChain)的配置类中完成。

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.HttpMethod;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.web.SecurityFilterChain;@Configuration@EnableWebSecuritypublic class SecurityConfiguration {    private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint;    // 通过构造器注入自定义的AuthenticationEntryPoint    public SecurityConfiguration(CustomAuthenticationEntryPoint customAuthenticationEntryPoint) {        this.customAuthenticationEntryPoint = customAuthenticationEntryPoint;    }    @Bean    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {        httpSecurity                .csrf(csrf -> csrf.disable()) // 禁用CSRF,通常RESTful API不需要                .authorizeHttpRequests(authorize -> authorize                        .requestMatchers(HttpMethod.GET, "/**").permitAll() // 允许GET请求无需认证                        .anyRequest().authenticated() // 其他所有请求需要认证                )                .httpBasic(httpBasic -> {}) // 启用HTTP Basic认证                .exceptionHandling(exceptionHandling -> exceptionHandling                        // 注册自定义的AuthenticationEntryPoint                        .authenticationEntryPoint(customAuthenticationEntryPoint)                );        return httpSecurity.build();    }}

注意: Spring Security 5.7.0-M2及更高版本推荐使用SecurityFilterChain和Lambda DSL进行配置,而不是继承WebSecurityConfigurerAdapter。上述代码已更新为现代Spring Security的配置方式。

5. 编写单元测试验证JSON响应

为了确保自定义的认证入口点按预期工作,编写一个单元测试是必不可少的。我们可以使用Spring的MockMvc来模拟HTTP请求并验证响应。

package com.example.security.custom.entrypoint;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;import org.springframework.context.annotation.Import;import org.springframework.test.web.servlet.MockMvc;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;// 指定需要测试的Web层组件,并导入SecurityConfiguration@WebMvcTest // 仅加载Web层相关的bean@Import({SecurityConfiguration.class, CustomAuthenticationEntryPoint.class}) // 导入安全配置和自定义入口点class SecurityCustomEntrypointApplicationTests {  @Autowired  private MockMvc mvc;  @Test  void testUnauthorizedResponseIsJson() throws Exception {    mvc        .perform(post("/somewhere")) // 发送一个POST请求到任意受保护的路径,但不提供认证凭据        .andDo(print()) // 打印请求

以上就是Spring Security自定义认证入口点:实现JSON格式未授权响应的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/306188.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
华为手机也能和iPhone互传文件了 鸿蒙6.0打通苹果生态
上一篇 2026年10月27日 05:24:28
Golang中如何实现一个简单的Worker Pool来管理任务
下一篇 2025年12月15日 18:36:31

相关推荐

  • 华为手机也能和iPhone互传文件了 鸿蒙6.0打通苹果生态

    华为手机也能和iPhone互传文件了 鸿蒙6.0打通苹果生态华为手机也能和iPhone互传文件了 鸿蒙6.0打通苹果生态华为手机也能和iPhone互传文件了 鸿蒙6.0打通苹果生态华为手机也能和iPhone互传文件了 鸿蒙6.0打通苹果生态

    在华为最新举办的harmonyos 6.0特别发布会上,公司正式发布了全新华为鸿蒙系统——harmonyos 6。新系统在视觉设计上更加精致优雅,功能层面实现了更智能、更流畅的操作体验,同时在安全性与用户交互方面也迎来了全面升级。此次推出的鸿蒙星河互联架构,极大增强了设备之间的连接性能,使设备感知更…

    2026年10月27日 • 用户投稿
    000
  • sublime怎么快速查看当前函数的定义_sublime函数定义快速定位技巧

    sublime怎么快速查看当前函数的定义_sublime函数定义快速定位技巧sublime怎么快速查看当前函数的定义_sublime函数定义快速定位技巧sublime怎么快速查看当前函数的定义_sublime函数定义快速定位技巧sublime怎么快速查看当前函数的定义_sublime函数定义快速定位技巧

    F12跳转+Ctrl+R搜索+插件增强可高效查看函数定义。将光标置于函数名按F12跳转,或用Ctrl+P输入@函数名查找;安装LSP或SublimeCodeIntel插件实现跨文件精准定位;通过Ctrl+R调出符号面板快速浏览当前文件函数,结合语法高亮包提升跳转准确性,适配多语言开发需求。 在 Su…

    2026年10月27日 • 用户投稿
    000
  • Safari浏览器清理缓存后登录信息丢失怎么办 Safari浏览器数据恢复方法

    Safari浏览器清理缓存后登录信息丢失怎么办 Safari浏览器数据恢复方法Safari浏览器清理缓存后登录信息丢失怎么办 Safari浏览器数据恢复方法Safari浏览器清理缓存后登录信息丢失怎么办 Safari浏览器数据恢复方法Safari浏览器清理缓存后登录信息丢失怎么办 Safari浏览器数据恢复方法

    清理Safari缓存导致登录信息丢失,主要因“网站数据”被清除,包含密码、自动填充信息等。若开启iCloud钥匙串,可前往设置→Apple ID→iCloud→密码,验证后查看并恢复密码;若书签丢失且开启iCloud同步,可通过iCloud.com网页端登录Apple ID,进入Safari图标找回…

    2026年10月27日 • 用户投稿
    000
  • 珊瑚岛游戏修改器最新版 珊瑚岛风灵月影正版修改器

    珊瑚岛游戏修改器最新版 珊瑚岛风灵月影正版修改器珊瑚岛游戏修改器最新版 珊瑚岛风灵月影正版修改器珊瑚岛游戏修改器最新版 珊瑚岛风灵月影正版修改器珊瑚岛游戏修改器最新版 珊瑚岛风灵月影正版修改器

    珊瑚岛游戏修改器功能全面,玩家可轻松实现无限材料、无限经验、自定义数值等操作,只需安装风灵月影客户端即可一键启用,特别适合新人玩家快速上手。本文将为大家提供珊瑚岛修改器最新版本,感兴趣的朋友千万别错过。 以下是珊瑚岛最新版修改器使用指南: 一、修改器获取方式 1.首先点击下方下载按钮安装官方正版风灵…

    2026年10月27日 • 用户投稿
    100
  • sublime怎么设置代码片段(snippet)的触发范围_sublime自定义Snippet触发条件配置

    sublime怎么设置代码片段(snippet)的触发范围_sublime自定义Snippet触发条件配置sublime怎么设置代码片段(snippet)的触发范围_sublime自定义Snippet触发条件配置sublime怎么设置代码片段(snippet)的触发范围_sublime自定义Snippet触发条件配置sublime怎么设置代码片段(snippet)的触发范围_sublime自定义Snippet触发条件配置

    在 Sublime Text 中设置代码片段的触发范围需配置 snippet 文件中的 scope,例如将 scope 设为 source.js 可使片段仅在 JavaScript 文件中通过 tabTrigger 触发,保存至 Packages/User/ 目录后即可生效。 在 Sublime T…

    2026年10月27日 • 用户投稿
    000
  • Java中如何创建一个简易的聊天工具

    Java中如何创建一个简易的聊天工具Java中如何创建一个简易的聊天工具Java中如何创建一个简易的聊天工具Java中如何创建一个简易的聊天工具

    答案:通过Socket编程实现简易聊天工具,服务器监听端口并为每个客户端创建处理线程,广播消息给其他客户端。1. ChatServer监听8888端口,接收连接并管理客户端列表;2. ClientHandler处理单个客户端的消息接收与发送,断开时移除自身;3. ChatClient连接服务器,输入…

    2026年10月27日 • 用户投稿
    200
  • 瑞达写作平台官网进入 瑞达写作App官方客户端下载中心

    瑞达写作平台官网进入 瑞达写作App官方客户端下载中心瑞达写作平台官网进入 瑞达写作App官方客户端下载中心瑞达写作平台官网进入 瑞达写作App官方客户端下载中心瑞达写作平台官网进入 瑞达写作App官方客户端下载中心

    瑞达写作平台官网地址是https://ipapers.net,该平台可30分钟内生成5万字论文初稿,支持多学科类型,具备智能改稿、图表公式生成、参考文献自动标注及降重功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 瑞达写作平台官网进入…

    2026年10月27日 • 用户投稿
    100
  • 真三国无双起源画面突然卡住怎么办 卡屏解决攻略

    真三国无双起源画面突然卡住怎么办 卡屏解决攻略真三国无双起源画面突然卡住怎么办 卡屏解决攻略真三国无双起源画面突然卡住怎么办 卡屏解决攻略真三国无双起源画面突然卡住怎么办 卡屏解决攻略

    真三国无双起源画面突然卡住,可通过更新显卡驱动、验证游戏文件完整性、关闭后台冲突程序以及调整游戏画质设置来有效缓解或解决该问题。 官方正版·武艺解锁·无限斗气·一键激活 >>>真三国无双起源修改器点击下载 Tips:如果上方按钮无法打开,请点击右侧链接直达https://www.w…

    2026年10月27日 • 用户投稿
    000
  • 蒂法和爱丽丝谁是官配?总监:不敢回答我只关心克劳德

    蒂法和爱丽丝谁是官配?总监:不敢回答我只关心克劳德蒂法和爱丽丝谁是官配?总监:不敢回答我只关心克劳德蒂法和爱丽丝谁是官配?总监:不敢回答我只关心克劳德蒂法和爱丽丝谁是官配?总监:不敢回答我只关心克劳德

    数十年来,围绕《最终幻想》中克劳德究竟该归属于谁的讨论从未平息。然而在《最终幻想7:重生》的开发过程中,总监滨口直树却选择远离这场旷日持久的“站队”纷争——他唯一的愿望,是让这位标志性的刺猬头发型英雄真正获得内心的安宁与幸福。 最初的《最终幻想7》并未明确勾勒出克劳德与队友之间的情感归属,但剧本中的…

    2026年10月27日 • 用户投稿
    000
  • win11系统内存占用过高怎么处理 win11内存占用优化方法

    win11系统内存占用过高怎么处理 win11内存占用优化方法win11系统内存占用过高怎么处理 win11内存占用优化方法win11系统内存占用过高怎么处理 win11内存占用优化方法win11系统内存占用过高怎么处理 win11内存占用优化方法

    首先结束高内存占用进程,再禁用SysMain服务、关闭视觉效果、管理启动项并调整虚拟内存,可显著降低Windows 11内存占用,提升系统响应速度与运行效率。 如果您发现Windows 11系统运行缓慢,任务管理器显示内存占用持续处于高位,这可能会影响程序的响应速度和整体使用体验。以下是针对此问题的…

    2026年10月27日 • 用户投稿
    100
  • 《小象超市》修改收货地址方法

    《小象超市》修改收货地址方法《小象超市》修改收货地址方法《小象超市》修改收货地址方法《小象超市》修改收货地址方法

    如何在小象超市更改收货地址? 1、打开小象超市app,进入主界面后点击“我的”入口。 2、跳转至个人中心页面后,选择“收货地址”选项。 3、进入地址管理页面,找到需要修改的地址,点击编辑图标。 图改改 在线修改图片文字 455 查看详情 4、进入编辑界面后,即可对收货地址和联系电话进行修改并保存。 …

    2026年10月27日 • 用户投稿
    800
  • 没见过如此惨烈的RTX 4090!严重扭曲、GPU/显存/电感全烧毁

    没见过如此惨烈的RTX 4090!严重扭曲、GPU/显存/电感全烧毁没见过如此惨烈的RTX 4090!严重扭曲、GPU/显存/电感全烧毁没见过如此惨烈的RTX 4090!严重扭曲、GPU/显存/电感全烧毁没见过如此惨烈的RTX 4090!严重扭曲、GPU/显存/电感全烧毁

    11月3日,我们通常会看到各式各样的显卡维修案例,但很少见到一块损坏如此彻底的显卡——几乎所有关键部位都出现了严重问题,最终只能无奈放弃修复。 Northwest Repair最近接收到一块技嘉AORUS RTX 4090显卡,用户最初反映仅是供电接口烧毁、部分元件脱落。然而随着拆解深入,技术人员发…

    2026年10月27日 • 用户投稿
    300
  • 夸克浏览器官方网址入口地址_夸克浏览器官网主页在线访问

    夸克浏览器官方网址入口地址_夸克浏览器官网主页在线访问夸克浏览器官方网址入口地址_夸克浏览器官网主页在线访问夸克浏览器官方网址入口地址_夸克浏览器官网主页在线访问夸克浏览器官方网址入口地址_夸克浏览器官网主页在线访问

    夸克浏览器官网主页在线访问入口地址是https://www.quark.cn/,用户可通过该网址使用AI搜索、文档处理、网盘服务及PPT生成等功能,并支持多端数据同步与内容聚合阅读。 夸克浏览器官网主页在线访问入口地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来夸克浏览器官方网址入口地…

    2026年10月27日 • 用户投稿
    000
  • 马斯克沉迷二次元!Grok推出AI伴侣新角色Mika

    马斯克沉迷二次元!Grok推出AI伴侣新角色Mika马斯克沉迷二次元!Grok推出AI伴侣新角色Mika马斯克沉迷二次元!Grok推出AI伴侣新角色Mika马斯克沉迷二次元!Grok推出AI伴侣新角色Mika

    近日,马斯克旗下的ai大模型grok再度推出一位全新虚拟女友角色——mika。这一角色一经亮相,便凭借极具辨识度的外形设计与强烈的性格反差,在二次元圈层中迅速掀起热议。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 根据xAI官方披露的信息…

    2026年10月27日 • 用户投稿
    200
  • sublime build system怎么配置_sublime自定义编译系统教程

    sublime build system怎么配置_sublime自定义编译系统教程sublime build system怎么配置_sublime自定义编译系统教程sublime build system怎么配置_sublime自定义编译系统教程sublime build system怎么配置_sublime自定义编译系统教程

    首先创建自定义编译系统,在Sublime Text中选择Tools → Build System → New Build System,编辑JSON配置文件,以C语言为例写入gcc编译运行命令,设置shell为true、工作目录为文件路径,关联source.c选择器,保存为C_GCC.sublime…

    2026年10月27日 • 用户投稿
    000
  • 《猪猪软件库》安装下载链接

    《猪猪软件库》安装下载链接《猪猪软件库》安装下载链接《猪猪软件库》安装下载链接《猪猪软件库》安装下载链接

    《猪猪软件库》安装下载链接: 下载地址:https://www.php.cn/link/bc15d64e322b822a8509e75eaaaa3762 猪猪软件库是一款功能强大的综合性软件资源平台。它不仅超越了传统应用市场的范畴,更打造了一个集各类优质、安全、实用软件于一体的数字宝库。无论你是追求…

    2026年10月27日 • 用户投稿
    300
  • Laravel开发:如何使用Laravel Validation验证请求数据?

    laravel开发:如何使用laravel validation验证请求数据? Laravel作为目前最流行的PHP框架之一,其原因之一就在于它提供了很多优秀的组件,其中之一是Laravel Validation。在Web开发过程中,我们常常需要验证从前端提交的数据是否符合规范,如表单提交等,这时候…

    用户投稿 2026年10月27日
    000
  • 全球首次采铝钛混合机身!苹果iPhone 18 Fold外观曝光

    苹果首款可折叠手机iPhone 18 Fold虽在发布时间上晚于部分安卓厂商,但有望凭借结构与材质的创新实现后来居上。 据最新爆料,该机型将采用铝与钛混合金属机身,结合钛金属的高强度和铝材的轻量化优势,力求在设备重量、耐用性及散热表现之间取得理想平衡。此前,钛金属仅应用于iPhone 15 Pro系…

    2026年10月27日
    1200
  • Java组合和继承的区别是什么 为什么更推荐组合

    继承通过extends实现“is-a”关系,子类复用父类代码但耦合高;组合通过成员变量实现“has-a”关系,灵活性强、耦合低,更易维护和扩展。 Java中组合和继承都是实现代码复用的重要手段,但它们在设计思想和使用场景上有本质区别。 继承是什么 继承是通过extends关键字让一个类获取另一个类的…

    2026年10月27日
    100
  • win11磁盘占用率一直很高怎么办_Win11磁盘占用过高处理方法

    win11磁盘占用率一直很高怎么办_Win11磁盘占用过高处理方法win11磁盘占用率一直很高怎么办_Win11磁盘占用过高处理方法win11磁盘占用率一直很高怎么办_Win11磁盘占用过高处理方法win11磁盘占用率一直很高怎么办_Win11磁盘占用过高处理方法

    1、禁用SysMain服务可减少磁盘高占用,通过services.msc找到该服务并设为禁用;2、关闭Windows搜索索引或重建索引以解决I/O过高问题;3、清理临时文件和调整虚拟内存设置减轻磁盘负载;4、禁用家庭组相关服务避免后台资源消耗。 如果您发现Windows 11系统运行缓慢,任务管理器…

    2026年10月27日 • 用户投稿
    500

发表回复

登录后才能评论
关注微信