Spring Security 登錄時異常信息拋出了未獲取到

在項目中用到了Spring Security 進行登錄校驗,我們實現了其UserDetailsService接口的loadUserByUsername()方法,並在其中定義了異常信息,通過UsernameNotFoundException異常類拋出,但是在結果中並未獲取到我們自定義的異常msg,而是獲取的"用戶名或密碼錯誤"(Spring Security自帶的)。這讓我百思不得其解。

於是自己進行debug追蹤代碼。在AbstractUserDetailsAuthenticationProvider類中的retrieveUser()方法我們找到了答案,這裏面先是調用了我們實現的loadUserByUsername()方法,然後拋出了UsernameNotFoundException異常,接着異常在AbstractUserDetailsAuthenticationProvider類中的authenticate()方法被捕捉。這裏有一個很關鍵的判斷:如果hideUserNotFoundExceptions爲true,就拋出BadCredentialsException異常,而且異常的msg是從Spring Security框架自帶的國際化配置文件中讀取的,因此不會拋出我們自定義的異常,而是一直拋出“用戶名或密碼錯誤”。

retrieveUser()方法:

authenticate()方法:

 

 

解決方法

1.自己配置AuthenticationProvider Bean,並設置hideUserNotFoundExceptions=false.

@Bean
public DaoAuthenticationProvider authenticationProvider(){
	DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
	provider.setPasswordEncoder(passwordEncoder());
	provider.setUserDetailsService(userDetailsService);
	provider.setHideUserNotFoundExceptions(false);
	return provider;
}

2.自定義異常類,並在loadUserByUsername()方法中拋出。

3.在loadUserByUsername()方法中拋出BadCredentialsException異常,不要拋出UsernameNotFoundException異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章