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认证失败返回错误信息踩坑记录的更多相关文章

  1. Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息

    [Please make sure to select the branch corresponding to the version of Thymeleaf you are using] Stat ...

  2. null?对象?异常?到底应该如何返回错误信息

    这篇文章记录我的一些思考.在工作了一段时间之后. 问题的核心很简单:到底如何返回错误信息. 学生时代,见到过当时的老师的代码: if (foo() == null) { } 当然,这位老师是一位比较擅 ...

  3. 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type

    给客户部署 PxxCms, 使用群发功能发送图文的的时候提示: 发生了Post错误:错误代码40005,微信返回错误信息:invalid file type, 没学过php伤不起 ... Google ...

  4. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  5. 安装VisualStudio时失败,错误信息安装包失败或证书不在有效期内

    本人安装VisualStudio2012的时候,安装失败有:错误信息安装包失败或证书不在有效期内等 网上查找相关信息,得到的答案很少,我重新网上下载同版本软件继续之前的下载,但还是无效 之后我把软件卸 ...

  6. API返回错误信息的最佳实践

    使用HTTP Status区分不同消息返回 最基础的三个状态200 OK, 400 Client Error, 500 Server Error 这些应该是够的, 如果客户端可以处理更细的划分, 可以 ...

  7. 使用jQuery异步传递Model到控制器方法,并异步返回错误信息

    需要通过jquery传递到控制器方法的Model为: public class Person { public string Name { get; set; } public int Age { g ...

  8. Shiro 认证失败返回JSON

    Shiro框架默认认证失败后会返回到登录页面,在前后端分离项目中,需要返回JSON数据,以便前端或者app端解析处理. 实现方式: 1. 扩展shiro框架的UserFilter类,重写redirec ...

  9. Spring中抛出异常时,既要要返回错误信息,还要做事务回滚

    情况一:如果没有在程序中手动捕获异常,如下代码事务会回滚 情况二:如果在程序中自已捕获异常未往外抛,如下代码事务不会回滚 如果doDbStuff2()这个操作数据库的方法抛出异常,因为将异常捕获未往外 ...

随机推荐

  1. 【比赛游记】THUSC2018酱油记

    day -1 早上4:30就要起来去飞机场…… 7点的飞机,10:30就到北京了. 北京的街景并没有我想像的漂亮……大概是因为我在四环外〒▽〒 晚上还有CF div3场,果断的去水了,因为太累就没有打 ...

  2. 18 - csv文件-ini文件处理

    目录 1 CSV文件 1.1 手动生成一个csv文件 1.2 cvs模块 1.2.1 reader方法 1.2.2 writer方法 2 ini文件处理 2.1 configparser模块 2.2 ...

  3. ActiveMQ 使用场景

    ActiveMQ 安装测试就不做介绍了,下面我说说ActiveMQ 使用场景.(松耦合与ActiveMQ) 1.非均匀应用集成 ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端 ...

  4. php CI框架

    CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序.如果你是一个使用共享主机,并且为客户所要求的期限 ...

  5. 在虚拟机(vmware)上安装CentOS

    第一步是安装虚拟机,这个比较简单就不讲了. 第二步准备CentOS的镜像文件准备安装 第三步安装CentOS: 新建虚拟机 选择自定义配置 选择硬件兼容标准 选择是否让vmware安装操作系统 选择将 ...

  6. c++中string类中的函数

    C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...

  7. web文件<async-supported>错误分析

    <async-supported>true</async-supported> 出现 cvc-complex-type.2.4.a: Invalid content was f ...

  8. 20155309 2016-2017-2《Java程序设计》课程总结

    预备作业1http://www.cnblogs.com/nhx19970709/p/6155580.html 第一次写博客,也是第一次用Markdown,具体流程都还不是很熟悉 预备作业2http:/ ...

  9. Vue-Socket.io

    github地址:https://github.com/MetinSeylan/Vue-Socket.io 安装: npm install vue-socket.io -S 注册: import Vu ...

  10. Python创建ES索引

    # pip install elasticsearch from datetime import datetime from elasticsearch import Elasticsearch es ...