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 證書過期
這里的話這些提示信息是可以定制的
后面我們將來定制一下這些異常信息,壞的憑證這樣的提示太不友好了
第一次寫博客,希望對別人有所幫助,也記錄一下自己的踩坑過程。