Spring Security的登陸驗證流程核心就是過濾器鏈。當一個請求到達時按照過濾器鏈的順序依次進行處理,經過全部過濾器鏈的驗證,就能夠訪問API接口了。spring
SpringSecurity提供了多種登陸認證的方式,由多種Filter過濾器來實現,好比:數據庫
根據咱們不一樣的需求實現及配置,不一樣的Filter會被加載到應用中。springboot
咱們就以用戶名、密碼登陸方式爲例講解一下Spring Security的登陸認證流程。ide
該過濾器封裝用戶基本信息(用戶名、密碼),定義登陸表單數據接收相關的信息。如:學習
UsernamePasswordAuthenticationFilter繼承自抽象類AbstractAuthenticationProcessingFilter,該抽象類定義了驗證成功與驗證失敗的處理方法。 3d
也就是說當咱們須要自定義驗證成功或失敗的處理方法時,要去實現AuthenticationSuccessHandler或AuthenticationfailureHandler接口code
ProviderManager用繼承於AuthenticationManager是登陸驗證的核心類。ProviderManager保管了多個AuthenticationProvider,用於不一樣類型的登陸驗證。好比:blog
public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean { …… private List<authenticationprovider> providers; ……
下文是ProviderManager的核心源碼,遍歷不一樣登陸驗證的AuthenticationProvider,只有當這種方式被支持的時候,才執行具體的登陸驗證邏輯。 繼承
public interface AuthenticationProvider { Authentication authenticate(Authentication var1) throws AuthenticationException; boolean supports(Class<!--?--> var1); }
AuthenticationProvider的實現類定義了具體的登陸驗證邏輯接口
public class DaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
從數據庫獲取用戶信息源碼
因此當咱們須要加載用戶信息進行登陸驗證的時候,咱們須要實現UserDetailsService
接口,重寫loadUserByUsername
方法,參數是用戶輸入的用戶名。返回值是UserDetails
。