Spring Security登陸驗證流程源碼解析

1、登陸認證基於過濾器鏈

Spring Security的登陸驗證流程核心就是過濾器鏈。當一個請求到達時按照過濾器鏈的順序依次進行處理,經過全部過濾器鏈的驗證,就能夠訪問API接口了。spring

file

SpringSecurity提供了多種登陸認證的方式,由多種Filter過濾器來實現,好比:數據庫

  • BasicAuthenticationFilter實現的是HttpBasic模式的登陸認證
  • UsernamePasswordAuthenticationFilter實現用戶名密碼的登陸認證
  • RememberMeAuthenticationFilter實現登陸認證的「記住我」的功能
  • SmsCodeAuthenticationFilter實現短信驗證碼登陸認證
  • SocialAuthenticationFilter實現社交媒體方式登陸認證的處理
  • Oauth2AuthenticationProcessingFilter和Oauth2ClientAuthenticationProcessingFilter實現Oauth2的鑑權方式

根據咱們不一樣的需求實現及配置,不一樣的Filter會被加載到應用中。springboot

2、結合源碼講解登陸驗證流程

咱們就以用戶名、密碼登陸方式爲例講解一下Spring Security的登陸認證流程。ide

file

2.1 UsernamePasswordAuthenticationFilter

該過濾器封裝用戶基本信息(用戶名、密碼),定義登陸表單數據接收相關的信息。如:學習

  • 默認的表單用戶名密碼input框name是username、password
  • 默認的處理登陸請求路徑是/login、使用POST方法

file file

2.2 AbstractAuthenticationProcessingFilter的doFilter方法的驗證過程

UsernamePasswordAuthenticationFilter繼承自抽象類AbstractAuthenticationProcessingFilter,該抽象類定義了驗證成功與驗證失敗的處理方法。 file3d

2.3 驗證成功以後的Handler和驗證失敗以後的handler

file

也就是說當咱們須要自定義驗證成功或失敗的處理方法時,要去實現AuthenticationSuccessHandler或AuthenticationfailureHandler接口code

file

3、登陸驗證內部細節

3.1多種認證方式的管理 ProviderManager

ProviderManager用繼承於AuthenticationManager是登陸驗證的核心類。ProviderManager保管了多個AuthenticationProvider,用於不一樣類型的登陸驗證。好比:blog

  • RememberMeAuthenticationProvider定義了「記住我」功能的登陸驗證邏輯
  • DaoAuthenticationProvider加載數據庫用戶信息,進行用戶密碼的登陸驗證
public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean {
    ……
    private List<authenticationprovider> providers;
    ……

下文是ProviderManager的核心源碼,遍歷不一樣登陸驗證的AuthenticationProvider,只有當這種方式被支持的時候,才執行具體的登陸驗證邏輯。 file繼承

3.2 登陸認證接口 AuthenticationProvider

public interface AuthenticationProvider {
    Authentication authenticate(Authentication var1) throws AuthenticationException;

    boolean supports(Class<!--?--> var1);
}

AuthenticationProvider的實現類定義了具體的登陸驗證邏輯接口

file

3.3 數據庫加載用戶信息 DaoAuthenticationProvider

public class DaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {

從數據庫獲取用戶信息源碼

file

因此當咱們須要加載用戶信息進行登陸驗證的時候,咱們須要實現UserDetailsService接口,重寫loadUserByUsername方法,參數是用戶輸入的用戶名。返回值是UserDetails

期待您的關注

相關文章
相關標籤/搜索