欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

程序员文章站 2022-05-14 10:52:30
Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使用SpringBoot的企业中,因为SpringSecurity安全框架由于其与spring框架无缝 ......

spring boot +spring security + thymeleaf认证失败返回错误信息踩坑记录

  步入8102年,现在企业开发追求快速,springboot以多种优秀特性引领潮流,在众多使用springboot的企业中,因为springsecurity安全框架由于其与spring框架无缝衔接等优秀特性被使用,这里记录一下使用这两个框架以及thymeleaf模板过程中遇到的一些坑

  记录时间:2018.11.30

  本人环境:

    os:windows 10

    jdk:1.8

    ide:intellij idea

    springboot:1.5.16

    springsecurity:4.2.8 

    thymeleaf:3.0.9

初学阶段,我们大都使用表单提交来进行登录,这里我们也采用这种方式

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

表单设计大都大同小异,这里就不过多赘述,接下来我们看下后台springsecurity的配置

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

我这里只配置了一个必要项,相信都看得懂,这样一来登录成功并且跳转到后台主界面是没有问题的,那如果登录失败我想在登录页上显示错误信息呢?

我们知道,spring security对于请求是经过一系列filter进行拦截的,其中用户登录验证这类的处理都是在usernamepasswordauthenticationfilter中,它继承自abstractauthenticationprocessingfilter。

在abstractauthenticationprocessingfilter里面对于登录失败这类异常的处理都在dofilter方法中

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

从这段代码我们看到它将捕获的异常都交给unsuccessfulauthentication来处理,接下来我们看看unsuccessfulauthentication方法

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

这里看到,最终处理这些异常的是failurehandler的onauthenticationfailure()方法

这里我们来看看failurehandler是什么

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

我们来看simpleurlauthenticationfailurehandler这个类

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

其中这个onauthenticationfailure()就是错误信息的处理

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

这里主要的处理操作是在saveexception()方法中

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

这段代码我们可以看出,异常就是保存在session中!最后看下是以什么名称保存的

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

到这里我们就知道了,页面上可以通过session获取spring_security_last_exception来获取异常信息

因为这里session中保存的是authenticationexception对象,我们再来看下保存的异常对象

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

其继承了runtimeexception,相信大家都很熟悉,所以就不过多赘述,这里基本就清楚了,我们从session中获取到该对象后再获取当前对象的message即可

因为对thymeleaf不够熟悉,这里怎么取session呢?

百度之后的结果:${session.spring_security_last_exception.message} 和 ${sessionscope.spring_security_last_exception.message} 

结果发现都获取不到值

这里在*上找到了解决方法

 https://*.com/questions/14042106/spring-security-sessionscope-appears-to-be-null-when-using-thymeleaf

在该问题下找到了答案

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

当然这里需要注意的一个小地方,应该是

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

(一个单双引号的问题需要注意下,不要直接拷贝过来用了.)

至此,尝试运行项目,页面已经可以显示异常信息了

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

补充一下,在springsecurity中,关于登录的异常有以下几个:

usernamenotfoundexception 用户找不到

badcredentialsexception 坏的凭据

accountstatusexception 用户状态异常它包含如下子类

accountexpiredexception 账户过期

lockedexception 账户锁定

disabledexception 账户不可用

credentialsexpiredexception 证书过期

这里的话这些提示信息是可以定制的

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

后面我们将来定制一下这些异常信息,坏的凭证这样的提示太不友好了

 第一次写博客,希望对别人有所帮助,也记录一下自己的踩坑过程。