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
。