Spring Security原理分析

  • 學(xué)習(xí)Spring Security原理,分析Spring Security的執(zhí)行流程

Spring Security過濾器鏈

Spring Security原理分析

1、Spring Security過濾器鏈

  • 發(fā)起請(qǐng)求
  • 用于身份認(rèn)證的過濾器
    • 1、UsernamePasswordAuthentication filter用于處理表單登錄
    • 2、Basic Authentication filter 用于認(rèn)證HttpBasic登錄
    • ...
    • 上面的步驟,如果是表單登錄那么久出發(fā)表單登錄過濾器,否則進(jìn)入Basic過濾器
      • 注意:
        • 實(shí)際應(yīng)用中過濾器鏈不止幾條,其實(shí)有很多條,不配置就不會(huì)生效
  • ExceptionTranslationFilter 過濾器
  • 根據(jù)FilerSecurity Interceptor等過濾器拋出來的異常做相應(yīng)的處理,(例如沒有登錄,會(huì)跳到用戶登錄界面)
    • FilerSecurityInterceptor 過濾器
      • 是Spring Security的最后一環(huán)
    • 經(jīng)過Spring Security 到達(dá) REST API

2、Debug斷點(diǎn)調(diào)試探究Spring Security的執(zhí)行順序

        import org.springframework.context.annotation.Configuration;
        import org.springframework.security.config.annotation.web.builders.HttpSecurity;
        import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
        
        @Configuration
        public class SecurityConfig extends WebSecurityConfigurerAdapter {
        
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.formLogin()
                        .and()
                        .authorizeRequests()
                        .anyRequest()
                        .authenticated();
            }
        }
  • 程序首先進(jìn)入FilterSecurityInterceptor
    • 程序先進(jìn)入FilterSecurityInterceptor方法,因?yàn)闆]有攜帶參數(shù),之前的過濾器都不起作用,在該過濾器中決定能否訪問后面的內(nèi)容,在配置中設(shè)置為所有的請(qǐng)求都需要進(jìn)行登錄認(rèn)證,因此在此處會(huì)拋出異常
 InterceptorStatusToken token = super.beforeInvocation(fi);
  • 到達(dá)ExceptionTranslationFilter
    • 上一步驟中的異常到達(dá)ExceptionTranslationFilter這個(gè)攔截器中,在這個(gè)攔截器中對(duì)異常進(jìn)行處理,處理實(shí)則為重定向,跳到默認(rèn)的登錄頁面上
        * SecurityContextHolderAwareRequestFilter
        * FilterChainProxy
        * RequestCacheAwareFilter
        * DefaultLogoutPageGeneratingFilter
        * OncePerRequestFilter
        * AbstractAuthenticationProcessingFilter
        * LogoutFilter
        * HeaderWriterFilter
        * SecurityContextPersistenceFilter
        * ApplicationFilterChain
        * WebAsyncManagerIntegrationFilter
        * ...
  • 經(jīng)過一些列Filter,頁面被重定向到login頁


    login登錄界面

    * 輸入用戶名和密碼

  • 到達(dá)斷點(diǎn)UsernamePasswordAuthenticationFilter

    • 拿到用戶名和密碼
  • 達(dá)到斷點(diǎn)FilterSecurityInterceptor
    * 處理完login跳轉(zhuǎn)到之前/user的請(qǐng)求
    * 自定義處理完成后,前端拿到請(qǐng)求的內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容