浅析Spring Security登录验证流程源码
作者:字母哥博客 发布时间:2023-03-22 01:46:44
一、登录认证基于过滤器链
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。
总结
以上所述是小编给大家介绍的Spring Security登录验证流程源码网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.cnblogs.com/zimug/archive/2019/11/18/11880050.html
猜你喜欢
- Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的鼠标单击、按下键盘等操作。在Swing事件处理的过程中,主要涉及三类对象:
- JenkinsJenkins是一个开源的、可扩展的持续集成、交付、部署的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台
- SimpleDateFormat是处理日期格式转换的类。官方API_1.8关于SimpleDateFormat继承于DateFormate截
- 一、定界符成帧Framer接口package framer;import java.io.IOException;import java.i
- 二分查找又称折半查找,它是一种效率较高的查找方法。折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以
- 在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,
- java Hibernate多对多映射前言:一、单向多对多 单向多对多的例子用人和职位来举例,一个人可以有多个职位
- 初次使用IDEA,创建一个maven工程,发现在目录结构中产生了两个不一样的东西——.iml文件和.idea文件夹。非常好奇,所以立刻上网查
- DATAXDataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postg
- 1. mybatis-plus开启二级缓存spring: datasource: type: com.alibaba.druid
- 一、DataSource首先大家要清楚DataSource属于MyBatis三层架构设计的基础层 然后我们来看看具体的实现。在数据持久层中
- 本文实例讲述了Java基于分治法实现的快速排序算法。分享给大家供大家参考,具体如下:package cn.nwsuaf.quick;/**
- 1.idea新建Maven项目Mybatis-study 将项目里的src文件夹删掉 依次将此项目作为父项目2.在Mybatis-study
- 在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应的注解,并不需要实现对应的逻辑。比如 mybatis和feign: 在 myba
- 本文实例讲述了Java数据结构之链表、栈、队列、树的实现方法。分享给大家供大家参考,具体如下:最近无意中翻到一本书,闲来无事写几行代码,实现
- logback输出日志屏蔽quartz的debug等级日志在一个spring的老项目中,使用了logback来作为日志管理,logback.
- 这篇文章主要介绍了java split()使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- 本文实例为大家分享了Android实现登录注册功能的具体代码,供大家参考,具体内容如下运行环境 Android Studio总体效果图一、
- Java 1.0 IO系统介绍1 Java IO版本Java库的IO分为输入/输出两部分。早期的Java 1.0版本的输入系统是InputS