自定義Spring Security的身份驗(yàn)證失敗處理方法
1.概述
在本快速教程中,我們將演示如何在Spring Boot應(yīng)用程序中自定義Spring Security的身份驗(yàn)證失敗處理。目標(biāo)是使用表單登錄方法對(duì)用戶進(jìn)行身份驗(yàn)證。
2.認(rèn)證和授權(quán)(Authentication and Authorization)
身份驗(yàn)證和授權(quán)通常結(jié)合使用,因?yàn)樗鼈冊(cè)谑谟柘到y(tǒng)訪問(wèn)權(quán)限時(shí)起著重要且同樣重要的作用。
但是,它們具有不同的含義,并在驗(yàn)證請(qǐng)求時(shí)應(yīng)用不同的約束:
身份驗(yàn)證 - 在授權(quán)之前;它是關(guān)于驗(yàn)證收到的憑證;我們驗(yàn)證用戶名和密碼是否與我們的應(yīng)用程序識(shí)別的用戶名和密碼相匹配
授權(quán) - 用于驗(yàn)證成功通過(guò)身份驗(yàn)證的用戶是否有權(quán)訪問(wèn)應(yīng)用程序的某個(gè)功能
我們可以自定義身份驗(yàn)證和授權(quán)失敗處理,但是,在此應(yīng)用程序中,我們將專注于身份驗(yàn)證失敗。
3. Spring Security的AuthenticationFailureHandler
Spring Security提供了一個(gè)默認(rèn)處理身份驗(yàn)證失敗的組件。
但是,我們發(fā)現(xiàn)于默認(rèn)行為不足以滿足實(shí)際要求的情況是很常見(jiàn)的。
如果是這種情況,我們可以創(chuàng)建自己的組件并通過(guò)實(shí)現(xiàn)AuthenticationFailureHandler接口提供我們想要的自定義行為:
public class CustomAuthenticationFailureHandler
implements AuthenticationFailureHandler {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception)
throws IOException, ServletException {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
Map<String, Object> data = new HashMap<>();
data.put(
"timestamp",
Calendar.getInstance().getTime());
data.put(
"exception",
exception.getMessage());
response.getOutputStream()
.println(objectMapper.writeValueAsString(data));
}
}
默認(rèn)情況下,Spring使用包含錯(cuò)誤信息的請(qǐng)求參數(shù)將用戶重定向回登錄頁(yè)面。
在此應(yīng)用程序中,我們將返回401響應(yīng),其中包含有關(guān)錯(cuò)誤的信息以及錯(cuò)誤發(fā)生的時(shí)間戳。
- DelegatingAuthenticationFailureHandler將AuthenticationException子類委托給不同的AuthenticationFailureHandler,這意味著我們可以為AuthenticationException的不同實(shí)例創(chuàng)建不同的行為
- ExceptionMappingAuthenticationFailureHandler根據(jù)AuthenticationException的完整類名將用戶重定向到特定的URL
- 無(wú)論AuthenticationException的類型如何,F(xiàn)orwardAuthenticationFailureHandler都會(huì)將用戶轉(zhuǎn)發(fā)到指定的URL
- SimpleUrlAuthenticationFailureHandler是默認(rèn)使用的組件,如果指定,它會(huì)將用戶重定向到failureUrl;否則,它只會(huì)返回401響應(yīng)
現(xiàn)在我們已經(jīng)創(chuàng)建了自定義AuthenticationFailureHandler,讓我們配置我們的應(yīng)用程序并覆蓋Spring的默認(rèn)處理程序:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth
.inMemoryAuthentication()
.withUser("baeldung")
.password("baeldung")
.roles("USER");
}
@Override
protected void configure(HttpSecurity http)
throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.failureHandler(customAuthenticationFailureHandler());
}
@Bean
public AuthenticationFailureHandler customAuthenticationFailureHandler() {
return new CustomAuthenticationFailureHandler();
}
}
注意failureHandler()調(diào)用,我們可以告訴Spring使用我們的自定義組件而不是使用默認(rèn)組件。
4.結(jié)論
在此示例中,我們使用Spring的AuthenticationFailureHandler接口自定義了應(yīng)用程序的身份驗(yàn)證失敗處理程序。
github源碼:https://github.com/eugenp/tutorials/tree/master/spring-security-mvc-login
相關(guān)文章
Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)AOP功能的封裝與配置的小框架實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
簡(jiǎn)單了解SpringCloud運(yùn)行原理
這篇文章主要介紹了簡(jiǎn)單了解SpringCloud運(yùn)行原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Spring?Boot中@Validated注解不生效問(wèn)題匯總大全
這篇文章主要給大家介紹了關(guān)于Spring?Boot中@Validated注解不生效問(wèn)題匯總的相關(guān)資料,@Validated注解是Spring框架中的一個(gè)注解,用于在方法參數(shù)上添加參數(shù)校驗(yàn)規(guī)則,需要的朋友可以參考下2023-07-07
詳解Java數(shù)組擴(kuò)容縮容與拷貝的實(shí)現(xiàn)和原理
這篇文章主要帶大家學(xué)習(xí)數(shù)組的擴(kuò)容、縮容及拷貝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
使用Java實(shí)現(xiàn)6種常見(jiàn)負(fù)載均衡算法
Java負(fù)載均衡算法也是分布式系統(tǒng)中的重要組成部分,用于將來(lái)自客戶端的請(qǐng)求分配到不同的后端服務(wù)器上,本文將介紹常見(jiàn)的Java負(fù)載均衡算法,輪詢法、加權(quán)隨機(jī)法……一次性讓你了解?6?種常見(jiàn)負(fù)載均衡算法2023-06-06

