Spring Boot + Spring Security解決UsernameNotFoundException無法被捕獲的問題

以下配置基于spring boot版本1.4.2.RELEASE湃交,默認(rèn)引入的spring security版本為4.1.3.RELEASE,頁面模板采用thymeleaf。

在MyUserDetailsService實(shí)現(xiàn)了UserDetailsService接口以后,在重寫的loadUserByUsername方法里驗(yàn)證用戶名不存在時(shí),我們會(huì)拋出一個(gè)UsernameNotFoundException異常或衡,比如:

throw new UsernameNotFoundException("用戶名不存在");

但是返回頁面以后, 發(fā)現(xiàn)并不能捕獲這個(gè)異常信息,通過[[${session.SPRING_SECURITY_LAST_EXCEPTION.message}]]方式獲得的異常信息始終是“Bad credentials”封断。

通過程序調(diào)試發(fā)現(xiàn)斯辰,系統(tǒng)在執(zhí)行到throw new UsernameNotFoundException("用戶名不存在")的時(shí)候,會(huì)執(zhí)行DaoAuthenticationProvider類的retrieveUser方法:

protected final UserDetails retrieveUser(String username,
            UsernamePasswordAuthenticationToken authentication)
            throws AuthenticationException {

        .............................
        catch (UsernameNotFoundException notFound) {
            if (authentication.getCredentials() != null) {
                String presentedPassword = authentication.getCredentials().toString();
                passwordEncoder.isPasswordValid(userNotFoundEncodedPassword,
                        presentedPassword, null);
            }
            throw notFound;
        }
        ..........................

    }

在這個(gè)方法會(huì)捕獲UsernameNotFoundException異常坡疼,繼續(xù)往下調(diào)試椒涯,會(huì)執(zhí)行到父抽象類AbstractUserDetailsAuthenticationProvider的authenticate方法:

public Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        
                 ....................
            catch (UsernameNotFoundException notFound) {
                logger.debug("User '" + username + "' not found");

                if (hideUserNotFoundExceptions) {
                    throw new BadCredentialsException(messages.getMessage(
                            "AbstractUserDetailsAuthenticationProvider.badCredentials",
                            "Bad credentials"));
                }
        ..................

    }

在這里會(huì)繼續(xù)捕獲到UsernameNotFoundException異常。
由于hideUserNotFoundExceptions的值為true回梧,所以這里會(huì)new一個(gè)新的BadCredentialsException異常拋出來废岂,那么最后捕獲到并放入session中的就是這個(gè)BadCredentialsException異常。
所以我們在頁面始終無法捕獲我們自定義的異常信息狱意。

這里提供兩個(gè)解決方案湖苞,當(dāng)然可能不是最好的,希望各位同學(xué)能夠給出更好的解決方案详囤。

第一個(gè)方案:
1.既然系統(tǒng)是捕獲UsernameNotFoundException類型的異常后再拋出新的BadCredentialsException異常财骨,那么我們干脆就不拋出UsernameNotFoundException異常。
我們模仿UsernameNotFoundException藏姐,創(chuàng)建自己的MyUsernameNotFoundException異常類隆箩。

public class MyUsernameNotFoundException extends AuthenticationException {

    private static final long serialVersionUID = 1L;

    public MyUsernameNotFoundException(String msg) {
        super(msg);
    }

    public MyUsernameNotFoundException(String msg, Throwable t) {
        super(msg, t);
    }
}

2.在MyUserDetailsService類的loadUserByUsername方法拋出我們自己定義的MyUsernameNotFoundException異常。

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {  
        
        .....................................
        if (sysUser == null) {  
            throw new MyUsernameNotFoundException("用戶名不存在");
        }  
        ....................................
    }

第二個(gè)方案:
在MyUserDetailsService類的loadUserByUsername方法直接拋出BadCredentialsException異常羔杨,這樣就不需要?jiǎng)?chuàng)建自己的MyUsernameNotFoundException異常類捌臊。

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {  
        
        .....................................
        if (sysUser == null) {  
            throw new BadCredentialsException("用戶名不存在");
        }  
        ....................................
    }

好了,這樣在頁面通過[[${session.SPRING_SECURITY_LAST_EXCEPTION.message}]]兜材,就能顯示我們自定義的異常信息了理澎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曙寡,隨后出現(xiàn)的幾起案子糠爬,更是在濱河造成了極大的恐慌,老刑警劉巖举庶,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件执隧,死亡現(xiàn)場離奇詭異,居然都是意外死亡户侥,警方通過查閱死者的電腦和手機(jī)镀琉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來添祸,“玉大人滚粟,你說我怎么就攤上這事寻仗∪忻冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耙替。 經(jīng)常有香客問我亚侠,道長,這世上最難降的妖魔是什么俗扇? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任硝烂,我火速辦了婚禮,結(jié)果婚禮上铜幽,老公的妹妹穿的比我還像新娘滞谢。我一直安慰自己,他們只是感情好除抛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布狮杨。 她就那樣靜靜地躺著,像睡著了一般到忽。 火紅的嫁衣襯著肌膚如雪橄教。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天喘漏,我揣著相機(jī)與錄音护蝶,去河邊找鬼。 笑死翩迈,一個(gè)胖子當(dāng)著我的面吹牛持灰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播负饲,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼搅方,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绽族?” 一聲冷哼從身側(cè)響起姨涡,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吧慢,沒想到半個(gè)月后涛漂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡检诗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年匈仗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢慌。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悠轩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攻泼,到底是詐尸還是另有隱情火架,我是刑警寧澤鉴象,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站何鸡,受9級特大地震影響纺弊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骡男,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一淆游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隔盛,春花似錦犹菱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至来屠,卻和暖如春虑椎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俱笛。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工捆姜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迎膜。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓泥技,卻偏偏與公主長得像,于是被迫代替她去往敵國和親磕仅。 傳聞我的和親對象是個(gè)殘疾皇子珊豹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)榕订,斷路器店茶,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,838評論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法劫恒,內(nèi)部類的語法贩幻,繼承相關(guān)的語法,異常的語法两嘴,線程的語...
    子非魚_t_閱讀 31,657評論 18 399
  • 第16章 Spring Boot安全集成Spring Security 開發(fā)Web應(yīng)用丛楚,對頁面的安全控制通常是必須...
    光劍書架上的書閱讀 8,858評論 1 78
  • 晚上跟妍哥聊天,說到每天給自己半個(gè)小時(shí)安靜的時(shí)間陪陪自己憔辫,我第一反應(yīng)是這是個(gè)好習(xí)慣趣些,得讓自己這樣努力。突然意識(shí)到贰您,...
    潘潘_1w9閱讀 356評論 1 1