基础篇-04.源码解析登录验证流程
目录
1.基于过滤器的登录验证

登录验证的基本原理
- 贯穿于整个过滤器链始终有一个上下文对象SecurityContext和一个Authentication对象(登录认证的主体)
- 一旦某一个该主体通过其中某一个过滤器的认证,Authentication对象信息被填充,比如:isAuthenticated=true表示该主体通过验证。
- 如果该主体通过了所有的过滤器,仍然没有被认证,在整个过滤器链的最后方有一个FilterSecurityInterceptor过滤器(虽然叫Interceptor,但它是名副其实的过滤器,不是拦截器)。判断Authentication对象的认证状态,如果没有通过认证则抛出异常,通过认证则访问后端API。
- 之后进入响应阶段,FilterSecurityInterceptor抛出的异常被ExceptionTransactionFilter对异常进行相应的处理。比如:用户名密码登录异常,会被引导到登录页重新登陆。
- 如果是登陆成功且没有任何异常,在请求响应中最后一个过滤器SecurityContextPersistenceFilter中将SecurityContext放入session。下次再进行请求的时候,直接从SecurityContextPersistenceFilter的session中取出认证信息。从而避免多次重复认证。
登录验证的方式
SpringSecurity提供了多种登录认证的方式,由多种Filter过滤器来实现,比如:
- BasicAuthenticationFilter实现的是HttpBasic模式的登录认证
- UsernamePasswordAuthenticationFilter实现用户名密码的登录认证
- RememberMeAuthenticationFilter实现登录认证的“记住我”的功能
- SocialAuthenticationFilter实现社交媒体方式登录认证的处理,如:QQ、微信
- Oauth2AuthenticationProcessingFilter和Oauth2ClientAuthenticationProcessingFilter实现Oauth2的鉴权方式
根据我们不同的需求实现及配置,不同的Filter会被加载到应用中。
2.过滤器登录验证细节

以使用最多的UsernamePasswordAuthenticationFilter为例,讲解登录验证细节
生成认证对象Authentication
- 根据username和password生成一个UsernamePasswordAuthenticationToken
- 在认证成功的情况下将会返回一个Authentication,该对象代表身份验证的主体,贯穿于用户认证流程始终
认证管理器ProviderManager
- ProviderManager是UsernamePasswordAuthenticationFilter父类的成员变量,其作用是持有多个AuthenticationProvider
- UsernamePasswordAuthenticationFilter会获取ProviderManager,并调用authenticate()方法,只要有一种方式被认证成功,Authentication对象就成为被认可的主体
认证处理器AuthenticationProvider
- AuthenticationProvider是实现各种认证方式的父类,定义了一个authenticate()方法,用于验证登录信息是否正确
- 以我们最常使用的数据库认证处理器DaoAuthenticationProvider为例,该类有一个成员变量UserDetailsService,需要我们在定义secutiry配置时注入,UserDetailsService需要我们实现从数据库加载用户信息功能
- 如果我们要自定义认证登录的逻辑,我们就需要继承AuthenticationProvider
SecurityContext
完成登录认证之后,将认证完成的Authtication对象(authenticate: true, 有授权列表authority list, 和username信息)放入SecurityContext上下文里面。后续的请求就直接从SecurityContextFilter中获得认证主体,从而访问资源。
3.UsernamePasswordAuthenticationFilter登录验证流程

需要进行配置或实现的地方
以上图片完整展示了UsernamePasswordAuthenticationFilter的登录验证流程,以下说明哪些部分是需要我们配置或自行定义的
- DaoAuthenticationProvider.UserDetailsService,需要我们实现获取用户信息的功能
- 认证成功之后的处理,这里有默认的处理器,如果在认证成功后需要进行特殊处理,则需要我们实现AuthenticationSuccessHandler并在配置类中进行处理
- 认证失败之后的处理,这里有默认的处理器,如果在认证失败后需要进行特殊处理,则需要我们实现AuthenticationfailureHandler并在配置类中进行处理

浙公网安备 33010602011771号