- 學(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
- FilerSecurityInterceptor 過濾器
2、Debug斷點(diǎn)調(diào)試探究Spring Security的執(zhí)行順序
- 將Spring Security配置成為表單登錄,訪問Web,http://127.0.0.1:8080/user
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)容