SpringSecurity認證流程


SpringSecurity
Spring Security,這是一種基於 Spring AOP 和 Servlet 過濾器的安全框架。 SpringSecurity采用的是責任式鏈的設計模式。它有一條很長的過濾器鏈;,
1,WebAsyncManagerIntegrationFilter:將Security上下文於SpringWeb中用於處理異步請求映射的WebAsyncmanager進行集成
2,SecurityContextPersistencrFilter:在每次請求處理之前將該請求相關的安全上下文信息加載到SecurityContextHolder中,然后在該次請求處理完成之后麻將SecurityContextHolder中關於這次請求的信息存儲的‘倉儲’中,然后將securityContextHolder中的信息清除,例如在Session中維護一個用戶的安全信息就是這個過濾器處理的
3,HeaderWriterFilter:用於將頭信息加入響應中,
4,CsrfFilter:用於處理跨站請求偽造
5,logoutFilter; 用於處理退出登錄
6,UsernamePasswordAuthenticationFilter: 用於處理基於表單的登錄請求,從表單中獲取用戶名和密碼,默認情況下處理來自/login的請求,從表單中獲取用戶名和密碼, 默認使用表單name值為username和password,這兩個值可以通過這個過濾器的usernaemparamter個passwordParameter連個參數的值進行修改
7,DefaultLoginPageGeneratingFilter:如果沒有配置登陸頁面,那系統初始化就會配置這個過濾器。並且用於在需要進行登陸時生成一個登陸表單頁
8,BasicAuthenticationFilter:檢測和處理http basic認證
9,RequestCacheAwareFilter:用於處理請求的緩存
10:SecurityContextHolderAwarRequestFilter: 主要包裝請求對象request
11,AnonymousAuthenticationfilter 檢測SecurityContextHolder中是否存在Authentication對象,如果不存在為其提供一個匿名Authentication
12,SessionmanagementFilter;管理session的過濾器
13,ExceptionTranslationFilter:處理AccessDeniedException和AuthenticationException異常
14,FilterSecurityInterceptor: 可以看作過濾器鏈的出口
15,RememberMeAuthenticationFilter:當用戶沒有登錄而直接訪問資源時,從cookie力找出用戶的信息,如果SpringSecurity能夠識別出用戶提供remember me cookie ,用戶將不必填寫用戶名和密碼,而是直接登錄進入系統,該過濾器默認從不開啟

認證流程
1.用戶發送用戶名和密碼進行登錄

2,先經過UsernamepasswordAuthenticationFilterd(父類為AbstractAuthenticationProcessingFilter)的attemptAuthentication(request,response),獲取用戶名和密碼,封裝 為UsernamePasswordAuthenticationToken,調用AuthenticationManager的authenticate(authentication) ----authentication對應第二步中的token

3,AuthenticationManager的authenticate(authentication),它的實現類為prooviderManager,並實現authenticate(),循環獲取正確的AuthenticationProvider,調用AbstractUserDatailsAuthenticationProvider.authenticate(),


4,AbstractUserDatailsAuthenticationProvider.authenticate(),驗證token是否符合這個類,在從緩存中獲取用戶信息,如果沒有,則調用user = retrieveUser(username(UsernamePasswordAuthenticationToken) authentication),這個方法由子類DaoAuthenticationProvider實現,調用成功后會返回一個UserDetails對象,然后會檢驗用戶名和密碼,調用createSuccessAuthentication(..)返回一個Authentication對象

5,DaoAuthenticationProvider.retrieveUser() 中UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username)表示調用UserDetailsService.loadUserByUsername(username);獲取數據庫中配置的用戶信息。返回一個UserDetails

6,返回一個UserDetails后,由AbstractUserDatailsAuthenticationProvider方法調用createSuccessAuthentication(principalToReturn, authentication, user);封裝成一個Authentication對象返回到AbstractAuthenticationProcessingFilter,然后將對象放入SecurityContext,再將SecurityContetx放入SecurityContextHolder

至此完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM