浅析Spring Security登录验证流程源码

 更新时间:2019年11月18日 08:25:13   作者:字母哥博客  
这篇文章主要介绍了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。

总结

以上所述是小编给大家介绍的Spring Security登录验证流程源码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • spring中使用@Autowired注解无法注入的情况及解决

    spring中使用@Autowired注解无法注入的情况及解决

    这篇文章主要介绍了spring中使用@Autowired注解无法注入的情况及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Mybatis常用分页插件实现快速分页处理技巧

    Mybatis常用分页插件实现快速分页处理技巧

    这篇文章主要介绍了Mybatis常用分页插件实现快速分页处理的方法。非常不错具有参考借鉴价值,感兴趣的朋友一起看看
    2016-10-10
  • Java中捕获线程异常的几种方式总结

    Java中捕获线程异常的几种方式总结

    这篇文章主要介绍了Java中捕获线程异常的几种方式总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java判断是否为简体中文字符的实现方法

    Java判断是否为简体中文字符的实现方法

    在应用开发中,判断简体中文字符是一个重要但常被忽视的任务,简体中文和繁体中文在字符上有显著的区别,因此在某些场景下我们需要判断输入的文本是否为简体中文,本文将介绍如何使用Java进行此判断,并提供相应的代码示例,帮助开发者更好地理解这一过程
    2024-09-09
  • spring快速入门实例教程

    spring快速入门实例教程

    这篇文章主要介绍了spring快速入门实例,主要分析了spring的基本配置与控制反转,对于spring的学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Spring从入门到源码之IOC基本用法

    Spring从入门到源码之IOC基本用法

    这篇文章给大家介绍了Spring从入门到源码之IOC基本用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-01-01
  • 简单易懂Java反射的setAccessible()方法

    简单易懂Java反射的setAccessible()方法

    本文主要介绍了简单易懂Java反射的setAccessible()方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • FuncGPT慧函数保护数据安全提高代码质量减少软件故障(java示例)

    FuncGPT慧函数保护数据安全提高代码质量减少软件故障(java示例)

    这篇文章主要为大家介绍了FuncGPT慧函数保护数据安全提高代码质量减少软件故障(java示例),有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java设计模式中桥接模式应用详解

    Java设计模式中桥接模式应用详解

    桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下
    2022-11-11
  • SpringBoot中@EnableAsync和@Async注解的使用小结

    SpringBoot中@EnableAsync和@Async注解的使用小结

    在SpringBoot中,可以通过@EnableAsync注解来启动异步方法调用的支持,通过@Async注解来标识异步方法,让方法能够在异步线程中执行,本文就来介绍一下,感兴趣的可以了解一下
    2023-11-11

最新评论