天天看點

了解Spring Security中的預設身份認證過濾器

作者:軟體架構

我們知道 Spring Security 會将 DelegatingFilterProxy 插入到 Servlet Filter Chain 中,然後将要過濾的請求通過 FilterChainProxy 代理給比對的 SecurityFilterChain;這些 SecurityFilterChain 中包含着真正做安全相關工作的 Filter 過濾器。

了解Spring Security中的預設身份認證過濾器
了解Spring Security中的預設身份認證過濾器

這些 Filter 過濾器中的一部分,它們的職責就是進行身份驗證,比如 UsernamePasswordAuthenticationFilter 和 BasicAuthenticationFilter。

UsernamePasswordAuthenticationFilter 是一個 AbstractAuthenticationProcessingFilter 的子類,實作了 attemptAuthentication 方法,沒有重寫其他方法。

從繼承關系可以看到 BasicHttpAuthenticationFilter 繼承自抽象類 OncePerRequestFilter。

public class BasicAuthenticationFilter extends OncePerRequestFilter

OncePerRequestFilter 的字面意思是:Once Per Request,即每個請求隻執行一次。

BasicAuthenticationFilter 的實作并不複雜,無非是從 Authorization header 中取出使用者名密碼,然後建立出 UsernameAuthenticationToken,接着調用 AuthenticationManager.authenticate() 方法。

BasicAuthenticationFilter 使用和 UsernamePasswordAuthenticationFilter 一樣的 AuthenticationProvider。

了解Spring Security中的預設身份認證過濾器

BasicAuthenticationFilter與 UsernamePasswordAuthenticationFilter 的差別在于認證之後的行為。

無論認證成功與否,BasicAuthenticationFilter 都不會做出重定向的響應。

  • 如果認證失敗,則通過預設的 BasicAuthenticationEntryPoint 傳回 401 響應
  • 如果認證成功,則繼續執行 filter chain,這樣就能執行到真正的業務方法
了解Spring Security中的預設身份認證過濾器