Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot集成SpringSecurity - 异常处理(三)

SpringBoot集成SpringSecurity - 异常处理(三)

作者头像
用户1212940
发布于 2022-04-13 09:05:54
发布于 2022-04-13 09:05:54
1.2K00
代码可运行
举报
文章被收录于专栏:LambdaLambda
运行总次数:0
代码可运行

源码地址:https://github.com/springsecuritydemo/microservice-auth-center03

当我们登录失败的时候,SpringSecurity 帮我们跳转到了 /login?error URL,奇怪的是不管是控制台还是网页上都没有打印错误信息。

这是因为首先 /login?error 是SpringSecurity 默认的失败 URL,其次如果你不自己处理这个异常,这个异常时不会被处理的。

一、常见异常

我们先来列举下一些 SpringSecurity 中常见的异常:

  • UsernameNotFoundException (用户不存在)
  • DisableException(用户已被禁用)
  • BadCredentialsException(坏的凭据)
  • LockedException(账号锁定)
  • CerdentialsExpiredException(证书过期)
  • ... 以上列出的这些异常都是 AuthenticationException 的子类,然后我们看 SpringSecurity 是如何处理 AuthenticationException 异常的。

二、源码分析

SpringSecurity的异常处理是在过滤器中进行的,我们在 AbastrctAuthenticationProcessingFilter 中找到了对 Authentication 的处理:

  • 在 doFilter() 中,捕获 AuthenticationException 异常,并交给 unsuccessfulAuthentication() 处理。
  • unsuccessfulAuthentication() 中,转交给了 SimpleUrlAuthenticationFailureHandler 类的 onAuthencicationFailure() 处理。
  • 在 onAuthenticationFailure() 中,首先判断有没有设置 defaultFailureUrl。 a. 如果没有设置,直接返回 401 错误,即 HttpStatus.UNAUTHORIZED 的值。 b. 如果设置了,首先执行 saveException() 方法。然后判断 forwardToDestination 是否为服务器调整,默认使用重定向即客户端跳转。
  • 在 saveException() 方法中,首先判断 forwardToDestination,如果使用服务器跳转则写入Request,客户端跳转则写入 Session。写入名为 WebAttributes.AUTHENTICATION_EXCEPTION 常量对应值SPRING_SECURITY_LAST_EXCEPTION,值为 AuthenticationException 对象。

至此 SpringSecurity 完成了异常处理,总结下流程:

–> AbstractAuthenticationProcessingFilter.doFilter() –> AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication() –> SimpleUrlAuthenticationFailureHandler.onAuthenticationFailure() –> SimpleUrlAuthenticationFailureHandler.saveException()

三、处理异常

上面通过源码看着挺复杂,但真正处理起来SpringSecurity为我们提供了方便的方式,我们只需要指定错误的url,然后在该方法中对异常进行处理即可。

  • 指定错误url ,在WebSecurityConfig 中添加 .failureUrl("/login/error")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 如果有允许匿名的url,填在下面
//                .antMatchers().permitAll()
                .anyRequest().authenticated()
                .and()
                // 设置登陆页
                .formLogin().loginPage("/login")
                // 设置登陆成功url
                .defaultSuccessUrl("/").permitAll()
                // 设置登录失败url
                .failureUrl("/login/error")
                // 自定义登陆用户名和密码参数,默认为username和password
//                .usernameParameter("username")
//                .passwordParameter("password")
                .and()
                .logout().permitAll()
                // 自动登录
                .and().rememberMe()
                .tokenRepository(persistentTokenRepository())
                // 有效时间,单位:s
                .tokenValiditySeconds(60)
                .userDetailsService(userDetailsService);

        // 关闭CSRF跨域
        http.csrf().disable();
    }
  • 在 Controller 中编写 loginError方法完成异常处理操作:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @GetMapping("/login/error")
    @ResponseBody
    public Result loginError(HttpServletRequest request) {
        AuthenticationException authenticationException = (AuthenticationException) request.getSession().getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
        log.info("authenticationException={}", authenticationException);
        Result result = new Result();
        result.setCode(201);

        if (authenticationException instanceof UsernameNotFoundException || authenticationException instanceof BadCredentialsException) {
            result.setMsg("用户名或密码错误");
        } else if (authenticationException instanceof DisabledException) {
            result.setMsg("用户已被禁用");
        } else if (authenticationException instanceof LockedException) {
            result.setMsg("账户被锁定");
        } else if (authenticationException instanceof AccountExpiredException) {
            result.setMsg("账户过期");
        } else if (authenticationException instanceof CredentialsExpiredException) {
            result.setMsg("证书过期");
        } else {
            result.setMsg("登录失败");
        }
        return result;
    }

四、运行项目

首先我们修改 CustomUserDetailsService loadUserByUsername() 方法的返回值:

  1. 输入错误的用户名或密码:
  1. 修改返回值:enable 为 false
  1. 修改返回值:accountNonExpired 为 false
  1. 修改返回值:credentialsNonExpired 为 false
  1. 修改返回值:accountNonLocked 为 false

五、存在问题

细心的同学再完成上面功能是会发现,当我们输入的用户名不存在时,不会抛出UserNameNotFoundException,而是抛出 BadCredentialsException这个异常,如果有需要区分 用户名不存在和密码错误的,可参考https://blog.csdn.net/wzl19870309/article/details/70314085

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
检索增强生成机理探寻:为什么要RAG?
RAG系列文章的核心观点来自于“灯塔书”《知识增强大模型》第4章《检索增强生成》的内容,这些内容是对书中内容进行补充和概览。书中以45页的篇幅详细介绍了RAG的概念、理论、构建RAG系统的流程,基于DIfy开源框架构建RAG系统的实战、关于RAG的最佳实践指南以及其他一些主流的可以用于构建RAG系统框架的介绍等等。内容非常丰富,实例可以立即上手,思考题可以引导启发,适合于教学和自学。
走向未来
2025/04/27
6300
RAG_Techniques:深入解析GitHub热门RAG技术宝库
在当今AI领域,检索增强生成(Retrieval-Augmented Generation,简称RAG)技术正以惊人的速度发展,成为将传统信息检索与生成式AI相结合的革命性方法。本文将带您深入探索GitHub上备受瞩目的RAG_Techniques项目,这是目前最全面的RAG技术集锦之一,为研究人员和实践者提供了丰富的高级技术实现和示例。
CoderJia
2025/05/07
3690
RAG_Techniques:深入解析GitHub热门RAG技术宝库
RAG (Retrieval-Augmented Generation) 教程
在自然语言处理(NLP)领域,生成式 AI(如 GPT-4)在文本生成方面表现优异,但其主要依赖于预训练的知识,无法动态获取最新信息。为了解决这一问题,RAG(检索增强生成,Retrieval-Augmented Generation)应运而生,它结合了信息检索(IR)与文本生成(NLG)技术,使得 AI 可以利用外部知识库,提高回答的准确性和可解释性。
IT蜗壳-Tango
2025/03/31
6850
生产级RAG系统一些经验总结
本文将探讨如何使用最新技术构建生产级检索增强生成(RAG)系统,包括健壮的架构、向量数据库(Faiss、Pinecone、Weaviate)、框架(LangChain、LlamaIndex)、混合搜索、重排序器、流式数据接入、评估策略以及实际部署技巧。
致Great
2025/05/02
1690
RAG从入门到放弃
想象一下,你有一个非常聪明但是有点“健忘”的朋友——大型语言模型(LLM),比如 GPT 系列。它能写诗、能编程、能跟你聊天,听起来很厉害吧?但是,它所知道的知识都来自于训练它的海量数据,这些数据是有时间范围的,而且不包含你个人或者特定领域最新的、私有的信息。
星哥玩云
2025/04/01
1100
RAG从入门到放弃
生成AI中最新的RAG方法,优缺点
近年来,人工智能技术取得了长足的进步,尤其是生成式人工智能取得了令人瞩目的进展。 IDC 研究显示,生成式 AI 市场规模预计将在 2022 年达到 107 亿美元,2026 年达到 326 亿美元。然而,生成式人工智能在其输出的质量、准确性和可靠性方面仍有改进的空间。引起关注的是检索增强生成(RAG)。 RAG是一种从外部知识源获取相关信息以提高生成式AI性能的技术。
致Great
2025/01/25
2510
RAG 技术综述
检索增强生成(Retrieval Augmented Generation,简称 RAG)向 LLM 提供了从特定数据源检索的信息,以此作为生成答案的基础。简而言之,RAG 结合了搜索和 LLM 的提示功能,在此基础上,模型根据搜索算法提供的信息,作为上下文来回答问题。这些查询和检索到的上下文会一并被注入到发送给 LLM 的提示中。
科技之歌
2024/02/01
1.6K0
RAG 技术综述
什么是检索增强生成 (RAG)?简单易懂,一文说清其组成和作用原理
人工智能一直在帮助企业处理各种事务,从简单的客户查询到复杂的问题解决。然而,即使是最先进的人工智能模型有时也会有不足之处,提供的答案也不太准确。
DenserAI_Chris
2024/09/15
1.4K0
什么是检索增强生成 (RAG)?简单易懂,一文说清其组成和作用原理
【RAG】001-RAG概述
检索增强生成(Retrieval-Augmented Generation,RAG)技术能够有效解决上述问题:
訾博ZiBo
2025/03/25
1770
【RAG】001-RAG概述
[完结14章]RAG全栈技术从基础到精通 ,打造高精准AI应用
RAG是一种结合检索(Retrieval)和生成(Generation)的技术,主要用于让AI在回答问题或生成内容时,能够更好地利用外部知识库,而不是完全依赖于自身预训练的知识。简单来说,它就像是给AI配了一个“外挂”,让它在回答问题时可以先去知识库中查找相关的资料,然后再生成答案。
奔跑企鹅907340320
2025/04/14
2900
RAG科普文!检索增强生成的技术全景解析
增强生成 (RAG) 是塑造应用生成式 AI 格局的关键技术。Lewis 等人在其开创性论文中提出了一个新概念面向知识密集型 NLP 任务的检索增强生成之后,RAG 迅速成为基石,提高了大型语言模型 (LLM) 输出的可靠性和可信度。
致Great
2025/02/15
8170
RAG科普文!检索增强生成的技术全景解析
【愚公系列】《AI Agent技术、应用与商业》004-Al Agent 的技术基础
在人工智能的广阔世界中,智能代理(AI Agent)作为一种重要的应用形态,发挥着越来越关键的作用。无论是在自动化客服、智能推荐,还是在复杂的决策支持系统中,智能代理都以其强大的功能和灵活的应用赢得了广泛关注。然而,支撑这些智能代理正常运作的技术基础是什么呢?
愚公搬代码
2025/03/14
1490
同济大学发布最新检索增强(RAG)的LLM生成技术综述
摘要主要介绍了大型语言模型(LLMs)在实际应用中面临的挑战,比如幻觉、知识更新缓慢和答案缺乏透明度等问题,并提出了检索增强生成(Retrieval-Augmented Generation,RAG)作为一种解决方案。RAG通过从外部知识库检索相关信息来辅助大型语言模型回答问题,已经被证明能显著提高回答的准确性,减少模型产生的幻觉,尤其是在知识密集型任务中。
唐国梁Tommy
2023/12/21
17K0
同济大学发布最新检索增强(RAG)的LLM生成技术综述
RAG 与 MCP 如何以不同方式解决大模型的局限性
Claude 和 GPT-4o 等大型语言模型 (LLM) 功能强大,但也面临两个主要限制:它们包含的知识是时效性的(更具体地说,是在训练时点固定的),并且决定它们一次可以处理多少信息的上下文窗口是有限的。
致Great
2025/04/21
2710
RAG 与 MCP 如何以不同方式解决大模型的局限性
LLM+RAG:让大模型成为真正的知识专家
随着大语言模型(LLM)技术的快速发展,如何让这些模型更好地利用外部知识成为一个重要课题。检索增强生成(RAG)作为一种结合信息检索和生成模型的技术,能够显著提升模型在知识密集型任务中的表现。本文将深入探讨LLM与RAG的结合,展示如何通过代码实现这一技术,并分析其在实际应用中的价值。
江南清风起
2025/04/03
1820
大模型+RAG,全面介绍!
大型语言模型(LLMs)在处理特定领域或高度专业化的查询时存在局限性,如生成不正确信息或“幻觉”。缓解这些限制的一种有前途的方法是检索增强生成(RAG),RAG就像是一个外挂,将外部数据检索集成到生成过程中,增强模型提供准确和相关响应的能力。
算法进阶
2024/05/31
8570
大模型+RAG,全面介绍!
最全梳理:一文搞懂RAG技术的5种范式!
本文主要回顾 RAG 技术的发展,第一部分梳理了综述和关键论文,第二部分梳理了工程实践工具。 
Datawhale
2025/02/24
1.6K0
最全梳理:一文搞懂RAG技术的5种范式!
干货!带你了解7种检索增强生成 (RAG) 技术
在简单RAG中,大型语言模型(LLM)接收用户查询,在向量存储库中进行相似性搜索或在知识图谱中进行关系搜索,然后基于检索到的信息生成答案。
致Great
2025/01/06
5.5K0
干货!带你了解7种检索增强生成 (RAG) 技术
RAG系统:大模型驱动的实时信息检索革新
RAG系统正逐步革新我们对AI驱动信息处理的认知。为充分发挥其潜力,理解其基本原理至关重要。本文旨在简明扼要地解析RAG系统,期望为读者提供洞见与共鸣。
AI浩
2024/12/30
2810
RAG系统:大模型驱动的实时信息检索革新
RAG是什么?
检索增强生成(RAG)是对大型语言模型输出进行优化的方法,使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)通过海量数据进行训练,利用数十亿个参数执行诸如回答问题、语言翻译和生成句子等任务。在已经具备强大功能的LLM基础上,RAG通过扩展其能力,使其能够访问特定领域或企业的内部知识库,而无需重新训练模型。这种方法经济高效,能够有效改进LLM输出,在不同情境下保持相关性、准确性和实用性。
灵雀云
2024/02/22
1.1K0
RAG是什么?
推荐阅读
相关推荐
检索增强生成机理探寻:为什么要RAG?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验