我们知道 Spring Security 会将 DelegatingFilterProxy 插入到 Servlet Filter Chain 中,然后将要过滤的请求通过 FilterChainProxy 代理给匹配的 SecurityFilterChain;这些 SecurityFilterChain 中包含着真正做安全相关工作的 Filter 过滤器。

springsecurity认证模式(Security中的默认身份认证过滤器)(1)

springsecurity认证模式(Security中的默认身份认证过滤器)(2)

这些 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。

springsecurity认证模式(Security中的默认身份认证过滤器)(3)

BasicAuthenticationFilter与 UsernamePasswordAuthenticationFilter 的区别在于认证之后的行为。

无论认证成功与否,BasicAuthenticationFilter 都不会做出重定向的响应。

,