shiro认证时出现报错Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken -
shiro認證時出現報錯:
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false] did not match the expected credentials.
當時出現這個問題是在生產的uat環境上出現的,說實話,挺幸運的,幸好是在uat環境上測出來的(公司的測試環境沒有發現),要是上生產出現這個問題,估計得挨批評了。。。
好了,廢話不多說,我來介紹一下這個報錯出現的場景。當時給客戶上的是兩套是系統(A和B),系統里面的用戶是相互獨立的,但是A系統的用戶是需要同步到B系統里去的,當時出現的問題就是A系統同步用戶到B系統,然后A系統在使用的過程中,修改了用戶的密碼(密碼也會同步過去),B系統里的這個用戶就登錄不了。當時給我的第一反應就是緩存問題,但這只是自己的懷疑而已,并沒有證據。
好吧,那我們自己找證據,根據現場給過來的log日志,我們可以直接定位到shiro源碼的報錯位置。
org.apache.shiro.realm.AuthenticatingRealm.assertCredentialsMatch(AuthenticatingRealm.java:603)
通過斷點,這里我們可以看見,應該是token和info里面的信息不配造成的。
好,那么我點doCredentialsMatch方法,好家伙!!!果然有問題,通過AuthenticationToken和AuthenticationInfo通過單詞的意思,我們可以猜出來,AuthenticationToken是登錄傳遞過來的,AuthenticationInfo是shiro里的Realm認證和授權的時候傳遞過來的,查看兩處相關代碼,有重大發現!Realm認證的時候,是從緩存中獲取的用戶信息!
那么分析到這里,問題就比較清晰了,A系統修改密碼,同步密碼信息的時候,是直接用SQL修改,沒有刷新到B系統里的緩存!
解決問題的方法有兩種,一種是去掉B系統這里的緩存。第二種是A系統同步密碼信息的時候,通知B系統刷新緩存!
總結
以上是生活随笔為你收集整理的shiro认证时出现报错Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken -的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3DMAX中旋转楼梯的做法
- 下一篇: 精英问题,大家没事可以做一做