SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录
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
初学阶段,我们大都使用表单提交来进行登录,这里我们也采用这种方式

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

我这里只配置了一个必要项,相信都看得懂,这样一来登录成功并且跳转到后台主界面是没有问题的,那如果登录失败我想在登录页上显示错误信息呢?
我们知道,Spring Security对于请求是经过一系列Filter进行拦截的,其中用户登录验证这类的处理都是在UsernamePasswordAuthenticationFilter中,它继承自AbstractAuthenticationProcessingFilter。
在AbstractAuthenticationProcessingFilter里面对于登录失败这类异常的处理都在doFilter方法中


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

这里看到,最终处理这些异常的是failureHandler的onAuthenticationFailure()方法
这里我们来看看failureHandler是什么

我们来看SimpleUrlAuthenticationFailureHandler这个类

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

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

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

到这里我们就知道了,页面上可以通过session获取SPRING_SECURITY_LAST_EXCEPTION来获取异常信息
因为这里session中保存的是AuthenticationException对象,我们再来看下保存的异常对象

其继承了RuntimeException,相信大家都很熟悉,所以就不过多赘述,这里基本就清楚了,我们从session中获取到该对象后再获取当前对象的message即可
因为对thymeleaf不够熟悉,这里怎么取session呢?
百度之后的结果:${session.SPRING_SECURITY_LAST_EXCEPTION.message} 和 ${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message}
结果发现都获取不到值
这里在StackOverflow上找到了解决方法
https://stackoverflow.com/questions/14042106/spring-security-sessionscope-appears-to-be-null-when-using-thymeleaf
在该问题下找到了答案

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

(一个单双引号的问题需要注意下,不要直接拷贝过来用了.)
至此,尝试运行项目,页面已经可以显示异常信息了

补充一下,在SpringSecurity中,关于登录的异常有以下几个:
UsernameNotFoundException 用户找不到
BadCredentialsException 坏的凭据
AccountStatusException 用户状态异常它包含如下子类
AccountExpiredException 账户过期
LockedException 账户锁定
DisabledException 账户不可用
CredentialsExpiredException 证书过期
这里的话这些提示信息是可以定制的


后面我们将来定制一下这些异常信息,坏的凭证这样的提示太不友好了
第一次写博客,希望对别人有所帮助,也记录一下自己的踩坑过程。
SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录的更多相关文章
- Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息
[Please make sure to select the branch corresponding to the version of Thymeleaf you are using] Stat ...
- null?对象?异常?到底应该如何返回错误信息
这篇文章记录我的一些思考.在工作了一段时间之后. 问题的核心很简单:到底如何返回错误信息. 学生时代,见到过当时的老师的代码: if (foo() == null) { } 当然,这位老师是一位比较擅 ...
- 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type
给客户部署 PxxCms, 使用群发功能发送图文的的时候提示: 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type, 没学过php伤不起 ... Google ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- 安装VisualStudio时失败,错误信息安装包失败或证书不在有效期内
本人安装VisualStudio2012的时候,安装失败有:错误信息安装包失败或证书不在有效期内等 网上查找相关信息,得到的答案很少,我重新网上下载同版本软件继续之前的下载,但还是无效 之后我把软件卸 ...
- API返回错误信息的最佳实践
使用HTTP Status区分不同消息返回 最基础的三个状态200 OK, 400 Client Error, 500 Server Error 这些应该是够的, 如果客户端可以处理更细的划分, 可以 ...
- 使用jQuery异步传递Model到控制器方法,并异步返回错误信息
需要通过jquery传递到控制器方法的Model为: public class Person { public string Name { get; set; } public int Age { g ...
- Shiro 认证失败返回JSON
Shiro框架默认认证失败后会返回到登录页面,在前后端分离项目中,需要返回JSON数据,以便前端或者app端解析处理. 实现方式: 1. 扩展shiro框架的UserFilter类,重写redirec ...
- Spring中抛出异常时,既要要返回错误信息,还要做事务回滚
情况一:如果没有在程序中手动捕获异常,如下代码事务会回滚 情况二:如果在程序中自已捕获异常未往外抛,如下代码事务不会回滚 如果doDbStuff2()这个操作数据库的方法抛出异常,因为将异常捕获未往外 ...
随机推荐
- 用jquery实现toast的原理
function toast(mess){ var str='<div class="mess"><span></span></div&g ...
- 2016 最佳 Linux 发行版排行榜【转】
转自:http://www.linuxstory.org/the-best-linux-distros-of-2016/?utm_source=tuicool&utm_medium=refer ...
- Hyperledger Fabric1.0.0搭建
系统环境: 阿里云新装的Centos7.2 yum -y update yum install -y openssl openssl-devel gcc gcc-c++ zlib zlib-devel ...
- easyui表单提交验证form
方式一,不需要考虑jquery.easyui.min.js版本 <script> $(function () { //针对 设置 novalidate:true $('.validateb ...
- HTML5 之图片上传预处理
在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 像我这么为用户着想的程序员,绝对不会让这种事情发生的, ...
- GUC-8 小练习
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...
- thinkphp3.2路由美化,url简化
thinkphp的路由功能很实用也很强大,可以简化url,有强大的正则匹配,可以做成任何想要的url样式. 在前台的config.php配置文件中: 1.首先开启路由 1 'URL_ROUTER_ON ...
- jump game(贪心算法)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 【运维实战】一次linux日志分割之路——将日志按照每小时进行分割,并按照“日期-小时”格式保存
是这样的,现在需要对nginx的access.log进行按照每小时进行分割,并且最好还要能够以 “日期+时间”的形式,命名保存. 两点,一个是按照每小时进行分割,一个是将日志以“日期+时间”的形式进行 ...
- Java注解Annotation(一)
Java注解Annotation(一)——简介 这一章首先简单介绍一下注解,下一章会给出一个注解应用的DEMO. 1. 元注解 元注解的作用是负责注解其他的注解. JDK1.5中,定义了4个标准的me ...