欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析SpringSecurity自定義登錄驗(yàn)證成功與失敗的結(jié)果處理問(wèn)題

 更新時(shí)間:2019年11月20日 08:26:18   作者:字母哥博客  
這篇文章主要介紹了SpringSecurity系列之自定義登錄驗(yàn)證成功與失敗的結(jié)果處理問(wèn)題,本文通過(guò)實(shí)例給大家講解的非常詳細(xì),具有一定的參考借鑒價(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ì)專門講解
      .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

總結(jié)

以上所述是小編給大家介紹的SpringSecurity自定義登錄驗(yàn)證成功與失敗的結(jié)果處理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • 如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開(kāi)發(fā)(最新推薦)

    如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開(kāi)發(fā)(最新推薦)

    本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無(wú)公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開(kāi)發(fā),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式

    使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式

    這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringCloud Config分布式配置中心使用教程介紹

    SpringCloud Config分布式配置中心使用教程介紹

    springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用
    2022-12-12
  • 利用EasyExcel導(dǎo)出帶有選擇校驗(yàn)框的excel

    利用EasyExcel導(dǎo)出帶有選擇校驗(yàn)框的excel

    EasyExcel是一個(gè)輕量級(jí)的Excel處理工具,支持Excel?2003(xls)和Excel?2007及以上版本(xlsx)的文件格式,本文將利用EasyExcel導(dǎo)出帶有選擇校驗(yàn)框的excel,需要的可以參考下
    2024-12-12
  • mybatis-plus 表名添加前綴的實(shí)現(xiàn)方法

    mybatis-plus 表名添加前綴的實(shí)現(xiàn)方法

    這篇文章主要介紹了mybatis-plus 表名添加前綴的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決

    Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決

    這篇文章主要介紹了Nacos-SpringBoot框架啟動(dòng)不加載bootstrap.yml的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java判斷用戶輸入的是否至少含有N位小數(shù)的實(shí)例

    java判斷用戶輸入的是否至少含有N位小數(shù)的實(shí)例

    下面小編就為大家分享一篇java判斷用戶輸入的是否至少含有N位小數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 深入淺析Mybatis的缺陷問(wèn)題

    深入淺析Mybatis的缺陷問(wèn)題

    Mybatis是業(yè)界非常流行的持久層框架,輕量級(jí)、易用,在金融IT領(lǐng)域完全是領(lǐng)軍地位,比Hibernate更受歡迎,優(yōu)勢(shì)非常多,也是非常值得我們學(xué)習(xí)的。這篇文章主要介紹了Mybatis的缺陷問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • SpringMVC的五大核心組件用法及說(shuō)明

    SpringMVC的五大核心組件用法及說(shuō)明

    這篇文章主要介紹了SpringMVC的五大核心組件用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Request的包裝類HttpServletRequestWrapper的使用說(shuō)明

    Request的包裝類HttpServletRequestWrapper的使用說(shuō)明

    這篇文章主要介紹了Request的包裝類HttpServletRequestWrapper的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論