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 證書過期

這里的話這些提示信息是可以定制的

后面我們將來定制一下這些異常信息,壞的憑證這樣的提示太不友好了

 第一次寫博客,希望對別人有所幫助,也記錄一下自己的踩坑過程。

 

 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM