您好,登錄后才能下訂單哦!
小編給大家分享一下SpringSecurity自定義登錄驗(yàn)證成功與失敗的結(jié)果怎么處理,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一、需要自定義登錄結(jié)果的場(chǎng)景
在我之前的文章中,做過(guò)登錄驗(yàn)證流程的源碼解析。其中比較重要的就是
當(dāng)我們登錄成功的時(shí)候,是由AuthenticationSuccessHandler進(jìn)行登錄結(jié)果處理,默認(rèn)跳轉(zhuǎn)到defaultSuccessUrl配置的路徑對(duì)應(yīng)的資源頁(yè)面(一般是首頁(yè)index.html)。
當(dāng)我們登錄失敗的時(shí)候,是由AuthenticationfailureHandler進(jìn)行登錄結(jié)果處理,默認(rèn)跳轉(zhuǎn)到failureUrl配置的路徑對(duì)應(yīng)的資源頁(yè)面(一般是登錄頁(yè)login.html)。
但是在web應(yīng)用開(kāi)發(fā)過(guò)程中需求是千變?nèi)f化的,有時(shí)需要我們針對(duì)登錄結(jié)果做個(gè)性化處理,比如:
我們希望不同的人登陸之后,看到不同的首頁(yè)
我們應(yīng)用是前后端分離的,驗(yàn)證響應(yīng)結(jié)果是JSON格式數(shù)據(jù),而不是頁(yè)面跳轉(zhuǎn)
以上的這些情況,使用Spring Security作為安全框架的時(shí)候,都需要我們使用本節(jié)學(xué)到的知識(shí)進(jìn)行自定義的登錄驗(yàn)證結(jié)果處理。
二、自定義登陸成功的結(jié)果處理
為了滿足上面的需求,我們?cè)撊绾稳プ瞿兀肯旅嬉恍」?jié)我們來(lái)說(shuō)明一下。AuthenticationSuccessHandler接口是Security提供的認(rèn)證成功處理器接口,我們只需要去實(shí)現(xiàn)它即可。但是通常來(lái)說(shuō),我們不會(huì)直接去實(shí)現(xiàn)AuthenticationSuccessHandler接口,而是繼承SavedRequestAwareAuthenticationSuccessHandler 類,這個(gè)類會(huì)記住用戶上一次請(qǐng)求的資源路徑,比如:用戶請(qǐng)求books.html,沒(méi)有登陸所以被攔截到了登錄頁(yè),當(dāng)你萬(wàn)成登陸之后會(huì)自動(dòng)跳轉(zhuǎn)到books.html,而不是主頁(yè)面。
@Component public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { //在application配置文件中配置登陸的類型是JSON數(shù)據(jù)響應(yīng)還是做頁(yè)面響應(yīng) @Value("${spring.security.logintype}") private String loginType; private static ObjectMapper objectMapper = new ObjectMapper(); @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { if (loginType.equalsIgnoreCase("JSON")) { response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(AjaxResponse.success())); } else { // 會(huì)幫我們跳轉(zhuǎn)到上一次請(qǐng)求的頁(yè)面上 super.onAuthenticationSuccess(request, response, authentication); } } }
在上面的自定義登陸成功處理中,既適應(yīng)JSON前后端分離的應(yīng)用登錄結(jié)果處理,也適用于模板頁(yè)面跳轉(zhuǎn)應(yīng)用的登錄結(jié)果處理
ObjectMapper 是Spring Boot默認(rèn)集成的JSON數(shù)據(jù)處理類庫(kù)Jackson中的類。
AjaxResponse是一個(gè)自定義的通用的JSON數(shù)據(jù)接口響應(yīng)類。
三、自定義登錄失敗的結(jié)果處理
這里我們同樣沒(méi)有直接實(shí)現(xiàn)AuthenticationFailureHandler接口,而是繼承SimpleUrlAuthenticationFailureHandler 類。該類中默認(rèn)實(shí)現(xiàn)了登錄驗(yàn)證失敗的跳轉(zhuǎn)邏輯,即登陸失敗之后回到登錄頁(yè)面。我們可以利用這一點(diǎn)簡(jiǎn)化我們的代碼。
@Component public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { //在application配置文件中配置登陸的類型是JSON數(shù)據(jù)響應(yīng)還是做頁(yè)面響應(yīng) @Value("${spring.security.logintype}") private String loginType; private static ObjectMapper objectMapper = new ObjectMapper(); @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { if (loginType.equalsIgnoreCase("JSON")) { response.setContentType("application/json;charset=UTF-8"); response.getWriter().write( objectMapper.writeValueAsString( AjaxResponse.error( new CustomException( CustomExceptionType.USER_INPUT_ERROR, "用戶名或密碼存在錯(cuò)誤,請(qǐng)檢查后再次登錄")))); } else { response.setContentType("text/html;charset=UTF-8"); super.onAuthenticationFailure(request, response, exception); } } }
在上面的自定義登陸失敗處理中,既適應(yīng)JSON前后端分離的應(yīng)用登錄失敗結(jié)果處理,也適用于模板頁(yè)面跳轉(zhuǎn)應(yīng)用的登錄失敗結(jié)果處理
登陸失敗之后,將默認(rèn)跳轉(zhuǎn)到默認(rèn)的failureUrl,即登錄界面。
四、配置SecurityConfig
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Resource private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler; @Resource private MyAuthenticationFailureHandler myAuthenticationFailureHandler; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() //禁用跨站csrf攻擊防御,后面的章節(jié)會(huì)專門(mén)講解 .formLogin() .successHandler(myAuthenticationSuccessHandler) .failureHandler(myAuthenticationFailureHandler) .defaultSuccessUrl("/index")//登錄認(rèn)證成功后默認(rèn)轉(zhuǎn)跳的路徑 .failureUrl("/login.html") //登錄認(rèn)證是被跳轉(zhuǎn)頁(yè)面 }
將自定義的AuthenticationSuccessHandler和AuthenticationFailureHandler注入到Spring Security配置類中
使用fromlogin模式,配置successHandler和failureHandler。
并且配置defaultSuccessUrl和failureUrl
以上是“SpringSecurity自定義登錄驗(yàn)證成功與失敗的結(jié)果怎么處理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。