Shiro身份驗證丟擲AuthenticationException異常,解決方案

薛8發表於2019-02-01
image

問題

在學習Shiro的時候,遇到Shiro丟擲org.apache.shiro.authc.AuthenticationException異常,完整異常如下:

org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - xue8, rememberMe=false].  Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
複製程式碼

出現這個異常的原因是因為身份驗證出錯了,但是我覺得我寫的Realm應該沒什麼錯誤,最後折騰了一會,翻看了一下Shiro的一些原始碼,終於知道出現這個問題的原因了,於是想將過程記錄下來。

解決

我在Realm的身份證驗證方法doGetAuthenticationInfo新增斷點進行除錯

image
發現是從authenticationToken獲取使用者密碼getCredentials()的時候出問題了,這就奇怪了,獲取使用者名稱getPrincipal()的時候沒問題,而且通過檢視authenticationToken的原始碼,發現他們兩個是一樣的東西
image
image
使用者名稱和密碼傳給doGetAuthenticationInfo的時候都是成功的,那為什麼會出錯呢?在除錯doGetAuthenticationInfo的時候,發現了username和password的儲存方式不一樣
image
username是以字串String的型別儲存的,而password是以字元陣列char[]型別儲存的,那會不會是因為這個問題造成的呢,而且在subject.login(token)方法中,使用者名稱和密碼都是以字串String儲存在token中的,
image
為什麼到了doGetAuthenticationInfo就變了呢,於是我繼續檢視了UsernamePasswordToken的原始碼,會不會是因為這個物件將密碼的字串型別轉成char[]型別呢
image
通過檢視原始碼,看到了確實是UsernamePasswordToken將傳入的密碼password從String字串型別轉成了char[]字元陣列型別,到這裡我也就明白了,在RealmdoGetAuthenticationInfo方法中,傳入的AuthenticationToken authenticationToken使用者名稱是以String方式儲存的而密碼是以Char[]儲存的,用接收String的方式去接收Char[]型別資料肯定就不行了呢,所以我將密碼改成用Char[]接收,如下
image

即可解決問題。

原文地址:ddnd.cn/2019/02/01/…

相關文章