Spring Security登录验证流程源码解析
2019-11-18 09:19:59来源:博客园 阅读 ()
Spring Security登录验证流程源码解析
一、登录认证基于过滤器链
Spring Security的登录验证流程核心就是过滤器链。当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了。
SpringSecurity提供了多种登录认证的方式,由多种Filter过滤器来实现,比如:
- BasicAuthenticationFilter实现的是HttpBasic模式的登录认证
- UsernamePasswordAuthenticationFilter实现用户名密码的登录认证
- RememberMeAuthenticationFilter实现登录认证的“记住我”的功能
- SmsCodeAuthenticationFilter实现短信验证码登录认证
- SocialAuthenticationFilter实现社交媒体方式登录认证的处理
- Oauth2AuthenticationProcessingFilter和Oauth2ClientAuthenticationProcessingFilter实现Oauth2的鉴权方式
根据我们不同的需求实现及配置,不同的Filter会被加载到应用中。
二、结合源码讲解登录验证流程
我们就以用户名、密码登录方式为例讲解一下Spring Security的登录认证流程。
2.1 UsernamePasswordAuthenticationFilter
该过滤器封装用户基本信息(用户名、密码),定义登录表单数据接收相关的信息。如:
- 默认的表单用户名密码input框name是username、password
- 默认的处理登录请求路径是/login、使用POST方法
2.2 AbstractAuthenticationProcessingFilter的doFilter方法的验证过程
UsernamePasswordAuthenticationFilter继承自抽象类AbstractAuthenticationProcessingFilter,该抽象类定义了验证成功与验证失败的处理方法。
2.3 验证成功之后的Handler和验证失败之后的handler
也就是说当我们需要自定义验证成功或失败的处理方法时,要去实现AuthenticationSuccessHandler或AuthenticationfailureHandler接口
三、登录验证内部细节
3.1多种认证方式的管理 ProviderManager
ProviderManager用继承于AuthenticationManager是登录验证的核心类。ProviderManager保管了多个AuthenticationProvider,用于不同类型的登录验证。比如:
- RememberMeAuthenticationProvider定义了“记住我”功能的登录验证逻辑
- DaoAuthenticationProvider加载数据库用户信息,进行用户密码的登录验证
public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean {
……
private List<AuthenticationProvider> providers;
……
下文是ProviderManager的核心源码,遍历不同登录验证的AuthenticationProvider,只有当这种方式被支持的时候,才执行具体的登录验证逻辑。
3.2 登录认证接口 AuthenticationProvider
public interface AuthenticationProvider {
Authentication authenticate(Authentication var1) throws AuthenticationException;
boolean supports(Class<?> var1);
}
AuthenticationProvider的实现类定义了具体的登录验证逻辑
3.3 数据库加载用户信息 DaoAuthenticationProvider
public class DaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {
从数据库获取用户信息源码
所以当我们需要加载用户信息进行登录验证的时候,我们需要实现UserDetailsService
接口,重写loadUserByUsername
方法,参数是用户输入的用户名。返回值是UserDetails
。
期待您的关注
- 博主最近新写了一本书:《手摸手教您学习SpringBoot系列-16章97节》
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
原文链接:https://www.cnblogs.com/zimug/p/11880050.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash