天天看点

理解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中的默认身份认证过滤器