流程說明
客戶端發(fā)起一個(gè)請(qǐng)求,進(jìn)入 Security 過濾器鏈没咙。
當(dāng)?shù)?LogoutFilter 的時(shí)候判斷是否是登出路徑猩谊,如果是登出路徑則到 logoutHandler ,如果登出成功則到 logoutSuccessHandler 登出成功處理祭刚,如果登出失敗則由 ExceptionTranslationFilter 牌捷;如果不是登出路徑則直接進(jìn)入下一個(gè)過濾器。
當(dāng)?shù)?UsernamePasswordAuthenticationFilter 的時(shí)候判斷是否為登錄路徑涡驮,如果是暗甥,則進(jìn)入該過濾器進(jìn)行登錄操作,如果登錄失敗則到 AuthenticationFailureHandler 登錄失敗處理器處理捉捅,如果登錄成功則到 AuthenticationSuccessHandler 登錄成功處理器處理撤防,如果不是登錄請(qǐng)求則不進(jìn)入該過濾器。
當(dāng)?shù)?FilterSecurityInterceptor 的時(shí)候會(huì)拿到 uri 棒口,根據(jù) uri 去找對(duì)應(yīng)的鑒權(quán)管理器寄月,鑒權(quán)管理器做鑒權(quán)工作,鑒權(quán)成功則到 Controller 層否則到 AccessDeniedHandler 鑒權(quán)失敗處理器處理无牵。
————————————————
SpringSecurity 過濾器鏈
SpringSecurity 采用的是責(zé)任鏈的設(shè)計(jì)模式漾肮,它有一條很長的過濾器鏈。現(xiàn)在對(duì)這條過濾器鏈的各個(gè)進(jìn)行說明:
WebAsyncManagerIntegrationFilter:將 Security 上下文與 Spring Web 中用于處理異步請(qǐng)求映射的 WebAsyncManager 進(jìn)行集成茎毁。
SecurityContextPersistenceFilter:在每次請(qǐng)求處理之前將該請(qǐng)求相關(guān)的安全上下文信息加載到 SecurityContextHolder 中克懊,然后在該次請(qǐng)求處理完成之后,將 SecurityContextHolder 中關(guān)于這次請(qǐng)求的信息存儲(chǔ)到一個(gè)“倉儲(chǔ)”中充岛,然后將 SecurityContextHolder 中的信息清除保檐,例如在Session中維護(hù)一個(gè)用戶的安全信息就是這個(gè)過濾器處理的。
HeaderWriterFilter:用于將頭信息加入響應(yīng)中崔梗。
CsrfFilter:用于處理跨站請(qǐng)求偽造夜只。
LogoutFilter:用于處理退出登錄。
UsernamePasswordAuthenticationFilter:用于處理基于表單的登錄請(qǐng)求蒜魄,從表單中獲取用戶名和密碼扔亥。默認(rèn)情況下處理來自 /login 的請(qǐng)求场躯。從表單中獲取用戶名和密碼時(shí),默認(rèn)使用的表單 name 值為 username 和 password旅挤,這兩個(gè)值可以通過設(shè)置這個(gè)過濾器的usernameParameter 和 passwordParameter 兩個(gè)參數(shù)的值進(jìn)行修改踢关。
DefaultLoginPageGeneratingFilter:如果沒有配置登錄頁面,那系統(tǒng)初始化時(shí)就會(huì)配置這個(gè)過濾器粘茄,并且用于在需要進(jìn)行登錄時(shí)生成一個(gè)登錄表單頁面签舞。
BasicAuthenticationFilter:檢測和處理 http basic 認(rèn)證。
RequestCacheAwareFilter:用來處理請(qǐng)求的緩存柒瓣。
SecurityContextHolderAwareRequestFilter:主要是包裝請(qǐng)求對(duì)象request儒搭。
AnonymousAuthenticationFilter:檢測 SecurityContextHolder 中是否存在 Authentication 對(duì)象,如果不存在為其提供一個(gè)匿名 Authentication芙贫。
SessionManagementFilter:管理 session 的過濾器
ExceptionTranslationFilter:處理 AccessDeniedException 和 AuthenticationException 異常搂鲫。
FilterSecurityInterceptor:可以看做過濾器鏈的出口。
RememberMeAuthenticationFilter:當(dāng)用戶沒有登錄而直接訪問資源時(shí), 從 cookie 里找出用戶的信息, 如果 Spring Security 能夠識(shí)別出用戶提供的remember me cookie, 用戶將不必填寫用戶名和密碼, 而是直接登錄進(jìn)入系統(tǒng)磺平,該過濾器默認(rèn)不開啟魂仍。