1. 程式人生 > >Spring boot + Spring Security + Thymeleaf 認證失敗返回錯誤資訊

Spring boot + Spring Security + Thymeleaf 認證失敗返回錯誤資訊

Spring boot +Spring Security + Thymeleaf 認證失敗返回錯誤資訊

Spring boot以其眾多友誼的特性,如零配置、微服務等,吸引了很多的粉絲。而其與Spring Security安全框架的無縫結合,使其具備的安全的特性。在此基礎上使用Thymeleaf模板引擎進行渲染,靜動態結合,讓頁面開發更加簡單、直觀。

通過表單提交登入的使用者名稱和密碼是登入介面比較常見的一種設計。在初學的過程中,我也不例外的採用個這種方式。表單設計見下圖。

登入成功,完成正常的主頁面跳轉,這個不存在問題。存在問題的是,登入失敗了該咋辦呢?我就在考慮,由於thymeleaf的區域性重新整理操作,登入失敗了將登入失敗的異常資訊顯示在登入頁面,也就是表單上。於是,我的登入設計又變成了如下圖所示的表單。

         通過這種方法,當登入表單驗證失敗時,會該使用者顯示”使用者名稱或密碼錯誤,請重試”,這當然是比較好的,但是驗證失敗的情況不僅僅是使用者名稱或密碼錯誤吧,應該還有其它的情形,比較常見的就有,該使用者已被鎖定,該使用者不存在,請先註冊等。

那麼該如何區分這麼情形呢,怎麼把登入表單驗證失敗的比較詳細的狀況顯示給使用者呢。經過一段時間的調研,發現Spring boot提供了比較完美的解決方案,而其祕密就在Spring Security的配置中。我專案中的Spring Security配置如下圖所示。

而我在閱讀Spring Security原始碼時,當認證失敗時,找尋到以下處理的程式碼


而重點就在saveException函式,而此函式的具體程式碼如下:


從這段程式碼中,我們可以清晰的看到,認證失敗的異常資訊被儲存在Session中,如果我們可以讀取Session中的資訊那麼,之前所遇到的問題就迎刃而解了吧。

事實上,事物的發展從來不是一帆風順的,解決問題也是類似。我瞭解到Thymeleaf提供了讀取快取Session的方案,就迫不及待的進行嘗試,於是乎,我的登入表單又變成了如下模樣,紅線指出的是Thymleaf快取的讀取方式。

這樣就可以顯示驗證失敗的具體資訊了嗎?經過我的測試,我發現,此資訊是未定義。也就是說,模樣讀取到快取中的資訊。

通過在網上查詢資料,我在浩瀚的百度的犄角旮旯裡,查詢到以下的程式碼片段。


         我如獲至寶,彷彿見到了光明。在配置檔案配置的時代,可以設定登入失敗的跳轉頁面為”/login.html?error=true”,而我設定的是“/login?error”,那麼是否可以設定為類似的true呢?我迫不及待的進行嘗試。於是乎,我Spring Security的Java Config又變成了如下的樣子。


經過驗證,通過這樣設定,完美的解決了我遇到的問題,到現在,我仍沒有明白設定true的含義,望知道的讀者可以告訴小編。

小編來總結哈,在Spring boot +Spring Security + Thymeleaf框架下,通過使用者名稱/密碼錶單提交,在登入介面獲取異常資訊的步驟,主要有以下兩點:

其一:將登入失敗的url設定為”/login?error=true”(即字尾帶?error=true),使前端的thymleaf可以讀取Session;

其二:Thymeleaf提供的讀取快取中資訊的方法${session.SPRING_SECURITY_LAST_EXCEPTION.message},兩者缺一不可。