标签:SpringBoot 用户 Spring 校验 认证 UsernamePasswordAuthenticationFilter Security
Spring Security认证流程
Spring Security认证流程如下图:(1) 用户发起表单登录请求后,首先进入UsernamePasswordAuthenticationFilter,UsernamePasswordAuthenticationFilter根据用户输入的用户名、密码构建了 UsernamePasswordAuthenticationToken,并将其交给 AuthenticationManager来进行认证处理。
AuthenticationManager是一个认证管理器,它定义了Spring Security如何执行认证操作,如果认证成功后,AuthenticationManager会返回一个Authentication对象设置到SecurityContextHolder中。AuthenticationManager是一个接口,它的默认实现类也是我们使用最多的实现类是ProviderManager。
(2) 在Spring Security中通常同时支持多种认证方式,不同的认证方式对应不同的AuthenticationProvider,因此在ProviderManager中存在一个AuthenticationProvider列表,ProviderManager会对列表中每一个AuthenticationProvider执行认证,最终得到认证结果。
(3) 传统的表单登录的 AuthenticationProvider 主要是由 AbstractUserDetailsAuthenticationProvider 来进行处理的,重点看下它的 authenticate()方法。
首先通过 retrieveUser() 方法读取到数据库中的用户信息,retrieveUser() 的具体实现在 DaoAuthenticationProvider 中,代码如下,loadUserByUsername()方法会返回一个UserDetails对象,这个对象封装了用户信息以及对应的权限信息,然后开始认证。UserDetailsService:SpringSecurity定义的核心接口,用于根据用户名获取用户信息,需要自行实现;UserDetails:Spring Security定义用于封装用户信息的类(主要是用户信息和权限),需要自行实现。
(4) 认证校验分为 前校验、附加校验和后校验,如果任何一个校验出错,就会抛出相应的异常。
(5) 所有校验都通过后,调用 createSuccessAuthentication() 返回认证信息,createSuccessAuthentication 方法重新 new 了一个 UsernamePasswordAuthenticationToken,因为到这里认证已经通过了,所以将 authorities 注入进去,并设置 authenticated 为 true,即需要认证。
(6) 至此认证信息就被传递回 UsernamePasswordAuthenticationFilter 中,在 UsernamePasswordAuthenticationFilter 的父类 AbstractAuthenticationProcessingFilter 的 doFilter() 中,会根据认证的成功或者失败调用相应的 handler。
总结:
- 当用户提交登录请求时,UsernamePasswordAuthenticationFilter会从当前请求HttpServletRequest中提取出登录用户名/密码;
- 拿到账户、密码后创建出一个UsernamePasswordAuthenticationToken对象,然后调用getAuthenticationManager().authenticate方法进行认证;
- 进入到我们前面说的ProviderManager的流程中;
- 如果认证失败,则SecurityContextHolder中相关信息将被清除,登陆失败回调也会被调用;
- 如果认证成功,则会进行登录信息存储,Session并发处理,登陆成功事件发布以及登陆成功方法回调等。
转载:
https://blog.51cto.com/u_13478207/3337065
https://www.cnblogs.com/wangstudyblog/p/14789712.html
标签:SpringBoot,用户,Spring,校验,认证,UsernamePasswordAuthenticationFilter,Security 来源: https://www.cnblogs.com/lchen-java/p/16512118.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。