(新)Spring Security如何自定义失败处理器

(直接从三、实战开始看)

(直接从三、实战开始看)

(直接从三、实战开始看)可点击:

(新)Spring Security如何自定义失败处理器-CSDN博客

我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。

在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。

如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置SpringSecurity即可。


在Spring Security中,你可以通过实现特定的接口来自定义认证失败处理器(AuthenticationFailureHandler)和授权失败处理器(AccessDeniedHandler)。以下是如何分别自定义它们的步骤:

一、自定义认证失败处理器(AuthenticationFailureHandler)

1.1创建自定义的AuthenticationFailureHandler

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler {@Overridepublic void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,AuthenticationException exception) throws IOException, ServletException {// 在这里处理认证失败的情况response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("登录失败: " + exception.getMessage());}
}

1.2在Spring Security配置中使用你的自定义认证失败处理器

@Override
protected void configure(HttpSecurity http) throws Exception {http// ... 其他配置 ....formLogin().failureHandler(new CustomAuthenticationFailureHandler()) // 设置自定义认证失败处理器// ... 其他表单登录配置 ...// ... 其他HTTP安全配置 ...;
}

二、自定义授权失败处理器(AccessDeniedHandler)

2.1创建自定义的AccessDeniedHandler

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;public class CustomAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,AccessDeniedException accessDeniedException) throws IOException, ServletException {// 在这里处理授权失败的情况response.setStatus(HttpServletResponse.SC_FORBIDDEN);response.getWriter().write("权限不足: " + accessDeniedException.getMessage());}
}

2.2在Spring Security配置中使用你的自定义授权失败处理器

@Override
protected void configure(HttpSecurity http) throws Exception {http// ... 其他配置 ....exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler()) // 设置自定义授权失败处理器// ... 其他异常处理配置 ...// ... 其他HTTP安全配置 ...;
}

三、实战

我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。

在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。

如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和AccessDeniedHandler然后配置SpringSecurity即可。

(com.sangeng.handler)

自定义认证失败处理器:

@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponseresponse, AuthenticationException authException) throws IOException,ServletException {ResponseResult result = newResponseResult(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录");String json = JSON.toJSONString(result);WebUtils.renderString(response, json);}
}

自定义授权失败处理器:

@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,AccessDeniedException accessDeniedException) throws IOException,ServletException {ResponseResult result = new ResponseResult(HttpStatus.FORBIDDEN.value(),"权限不足");String json = JSON.toJSONString(result);WebUtils.renderString(response, json);}
}

修改配置类:

@Configuration //配置类
@EnableWebSecurity // 开启Spring Security的功能 代替了 implements WebSecurityConfigurerAdapter
public class SecurityConfig {@AutowiredAuthenticationConfiguration authenticationConfiguration;//获取AuthenticationManager@AutowiredJwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;@AutowiredAccessDeniedHandlerImpl accessDeniedHandler;@AutowiredAuthenticationEntryPointImpl authenticationEntryPoint;@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic AuthenticationManager authenticationManagerBean() throws Exception {return authenticationConfiguration.getAuthenticationManager();}/*** 配置Spring Security的过滤链。** @param http 用于构建安全配置的HttpSecurity对象。* @return 返回配置好的SecurityFilterChain对象。* @throws Exception 如果配置过程中发生错误,则抛出异常。*/@BeanSecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// 禁用CSRF保护.csrf(csrf -> csrf.disable())// 设置会话创建策略为无状态.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))// 配置授权规则                 指定user/login路径.允许匿名访问(未登录可访问已登陆不能访问). 其他路径需要身份认证.authorizeHttpRequests(auth -> auth.requestMatchers("/user/login").anonymous().anyRequest().authenticated())//开启跨域访问.cors(AbstractHttpConfigurer::disable)// 添加JWT认证过滤器.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)// 配置异常处理.exceptionHandling(exception -> exception.accessDeniedHandler(accessDeniedHandler).authenticationEntryPoint(authenticationEntryPoint));// 构建并返回安全过滤链return http.build();}

注意事项

  • 确保你的认证和授权失败处理器都正确实现了相应的接口,并且正确设置了它们的状态码和响应内容。
  • 你可以将你的自定义处理器作为Spring Bean注入到你的配置中,而不是直接在配置方法中创建新的实例。这样可以更好地管理你的Spring应用程序中的bean。
  • 在处理认证和授权失败时,你可能希望返回JSON而不是纯文本响应,特别是在构建RESTful API时。为此,你可以使用@ResponseBody注解或ResponseEntity类来构建JSON响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 的原理简介

人工智能(AI)在过去的几十年里取得了巨大的进步,其中一种令人瞩目的应用就是聊天机器人。ChatGPT 就是这样一款通过自然语言处理与用户进行对话的 AI 工具。它是基于 OpenAI 的 GPT(Generative Pre-trained Transformer&#xff0…

ESP32 双线汽车接口 (TWAI)

一:TWAI概述 双线汽车接口 (TWAI) 是一种适用于汽车和工业应用的实时串行通信协议。它兼容 ISO11898-1 经典帧(CAN2.0),因此可以支持标准帧格式(11 位 ID)和扩展帧格式(29 位 ID&#x…

【Qt】Qt出现“xcb”相关错误,解决方法汇总

1、缺少 libxcb 库 1.1 Ubuntu系统 1)问题 在Ubuntu等桌面系统中,第一次Qt程序时报错: qt.qpa.plugin:Could not load the Qt platform plugin “xcb“2)原因 详细原因查找步骤,参考博客:【Qt】Ubuntu18.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform …

thinksboard新建菜单

1.打开目录\thingsboard\ui-ngx\src\app\modules\home\pages新增npages文件夹 2.新增npages.module.ts以及npages-routing.module.ts控制文件,以及页面展示文件npages.component.html,npages.component.scss,npages.component.ts 3.打开npages.component.ts文件&…

最新AI智能聊天对话问答系统源码(详细图文搭建部署教程)+AI绘画系统,DALL-E3文生图, Whisper TTS 语音识别,文档分析

一、人工智能 随着人工智能技术的持续进步,AI绘画已经发展成为一个日益成熟的领域。越来越多的人开始尝试使用AI绘画软件来创作艺术作品。尽管这些AI绘画软件对绘画领域产生了显著影响,但它们并不会完全取代画师。与传统手绘不同,AI绘画可以…

【第2章】MyBatis-Plus代码生成器

文章目录 前言一、安装二、生成方式1.DefaultQuery (元数据查询)2.存在问题 三、快速生成1. 生成代码2. 目录结构 四、交互式总结 前言 全新的 MyBatis-Plus 代码生成器,通过 builder 模式可以快速生成你想要的代码,快速且优雅,跟随下面的代…

Pikachu 靶场 SSRF 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台,用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境,供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术,…

揭秘软文发稿秘诀:打造高效推广营销

你是否有在看一篇文章时,可能明知道它是一则广告但仍心甘情愿的继续了解下去,这样的文章大概率就是一篇软文,在当今信息爆炸的时代,软文作为一种有效的推广营销手段,已经成为各大企业、品牌争相使用的利器。然而&#…

安装Cmakeffmpeglibssh

首先安装cmake: sudo apt install cmake cmake --version然后这个输出正常就装好了 然后安装ffmpeg: tar xvzf n4.4.tar.gz cd FFmpeg-n4.4 chmod x configure ./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-debug --disable-opti…

关于VMware遇到的一些问题

问题一:打不开磁盘…或它所依赖的某个快照磁盘,开启模块DiskEarly的操作失败,未能启动虚拟机 解决方法: 首先将centos 7关机,然后把快照1删掉 然后打开虚拟机所在目录,把提示的000001.vmdk全部删除&…

Java创建一个线程发生的事情

Java创建一个线程发生的事情 1.分配线程栈 线程对象被创建后,JVM会分配一个独立的线程栈,用于存储该线程的方法调用、局部变量等。还有本地方法栈,用来调用本地方法栈服务。还有程序计数器,这个就是我们线程所执行字节码指示灯&…

Spring Boot中的自定义Starter开发

Spring Boot中的自定义Starter开发 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何在Spring Boot中开发一个自定义Starter,以便在…

Linux:系统引导过程与服务控制

目录 一、linux 系统引导过程 1.1、引导过程总览 1.2、系统初始化进程 (centos 6和7 的区别) 1.2.1、centos 6 的引导过程 init 进程 1.2.2、centos 7(systemd进程) 二、MBR、GRUB菜单、忘记密码故障修复 2.1、修复MBR扇区故障 模拟故障 重启…

详解 ClickHouse 的表引擎

一、简介 表引擎决定了如何存储表的数据。包括: 数据的存储方式和位置,写到哪里以及从哪里读取数据支持哪些查询以及如何支持并发数据访问索引的使用(如果存在)是否可以执行多线程请求数据复制参数 表引擎的使用方式:…

迭代器模式观察者模式

文章目录 1.引出迭代器模式1.展示院系结构2.传统方式 2.迭代器模式解决院系结构展示问题1.基本介绍2.原理类图3.类图4.代码实现1.Department.java 存储信息的对象2.College.java 被迭代的类型接口3.ComputerCollege.java 被迭代的具体实现类,存储数据并将其在创建迭…

CNware虚拟化平台功能介绍:虚拟机业务连续性保护,确保核心业务持续运行,构筑稳健的数字防线

全球数字化转型的大潮中,虚拟化技术已成为企业IT架构的基石。据Gartner预测,到2026年,全球90%以上的组织将采用某种形式的虚拟化技术。虚拟化环境的广泛应用,不仅提升了资源利用率、降低了成本,更极大地增强了业务灵活…

forwhile(Python)

文章目录 前言一、for二、while 前言 循环:就是让指定的代码重复的执行。 一、for for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。 forfor i in list:循环主体for i in [1, 2, 3, 4, 5]:print(i)**************************************…

“管式加热炉简单控制系统和串级控制系统设计与Matlab仿真”,高分资源,匠心制作,下载可用。强烈推荐!!!

“管式加热炉简单控制系统和串级控制系统设计与Matlab仿真”毕业设计,高分资源,匠心制作,下载可用。强烈推荐!!! 1.控制目标 加热炉的任务是把原油加热到一定温度,以保证下道工艺的顺利进行。…

企业如何通过数据资产入表与融资加速数字化转型

数据作为五大生产要素之一,是数字经济发展的基础。如何对数据资产进行确权、核算和变现,已成为数字经济时代的难点和热点。随着“数据资产入表”的提出与实践,这一领域迎来了新的变化与机遇。 一、什么是数据资产入表 在我国,数据…

二种方法轻松提取音频中的钢琴声音

在音乐制作、音频编辑或是纯粹的音乐爱好者的世界里,有时我们需要从复杂的音乐编排中抽取出特定乐器的声音,比如那悠扬的钢琴旋律。这不仅能帮助我们更好地理解音乐的结构,还能在创作过程中提供灵感。本文将介绍两种简单有效的方法&#xff0…